找到最近的标记节点
难度:
标签:
题目描述
代码结果
运行时间: 49 ms, 内存: 17.9 MB
/*
题目思路:
1. 输入为一个整数数组和一个目标值。
2. 我们需要找到数组中距离目标值最近的元素。
3. 返回该元素的索引。
4. 使用Java Stream API简化实现。
*/
import java.util.stream.IntStream;
public class FindClosestNodeStream {
public int findClosest(int[] nums, int target) {
return IntStream.range(0, nums.length)
.boxed()
.min((i, j) -> Integer.compare(Math.abs(nums[i] - target), Math.abs(nums[j] - target)))
.orElse(-1);
}
public static void main(String[] args) {
FindClosestNodeStream solution = new FindClosestNodeStream();
int[] nums = {1, 3, 7, 8, 9};
int target = 5;
System.out.println(solution.findClosest(nums, target)); // Output: 1
}
}
解释
方法:
该题解采用了带优先级队列的Dijkstra算法来寻找从起点s到任意标记节点的最短距离。首先,将所有标记节点存储在集合中以便快速检查。接着,构建图的邻接表表示,然后使用一个优先队列(最小堆)来维护当前节点到起点的距离。每次从队列中取出距离最小的节点,如果该节点是标记节点,则直接返回其距离。否则,更新其邻接节点的距离,并将更新后的距离和节点推入队列中。如果遍历完所有可达节点后未找到标记节点,则返回-1。
时间复杂度:
O((V + E) log V)
空间复杂度:
O(V + E)
代码细节讲解
🦆
在Dijkstra算法中,使用优先队列(最小堆)的目的是什么?为什么这种数据结构适合于此算法?
▷🦆
题解中提到,如果当前节点已经不是最优距离就跳过,这种策略是如何确保算法的效率的?它会不会导致某些节点的距离没有得到正确更新?
▷🦆
当所有标记节点都不可达时,题解选择返回-1。这种设计对算法的应用场景有什么影响?是否有其他可能的返回值设计?
▷🦆
为什么需要将标记节点转换为集合来进行快速查找?直接在列表中查找有什么潜在的性能问题?
▷