题目地址:
https://www.lintcode.com/problem/search-graph-nodes/description
给定一个无向图,再给定一个顶点和一个数字target,求距离该顶点最近的且值为target的顶点。
可以用BFS来做,一旦遍历到值为target的顶点就可以返回了。代码如下:
import java.util.*;
public class Solution {
/*
* @param graph: a list of Undirected graph node
* @param values: a hash mapping, <UndirectedGraphNode, (int)value>
* @param node: an Undirected graph node
* @param target: An integer
* @return: a node
*/
public UndirectedGraphNode searchNode(ArrayList<UndirectedGraphNode> graph,
Map<UndirectedGraphNode, Integer> values,
UndirectedGraphNode node,
int target) {
// write your code here
if (graph == null || graph.size() == 0) {
return null;
}
// 如果起点的值就是target,直接返回起点
if (values.get(node) == target) {
return node;
}
Set<UndirectedGraphNode> visited = new HashSet<>();
Queue<UndirectedGraphNode> queue = new LinkedList<>();
queue.offer(node);
visited.add(node);
while (!queue.isEmpty()) {
// 从队列里取出一个顶点,接着遍历其邻居
UndirectedGraphNode cur = queue.poll();
for (UndirectedGraphNode neighbor : cur.neighbors) {
// 如果这个邻居未访问过,则进行下一步逻辑
if (!visited.contains(neighbor)) {
// 如果这个邻居的值正好是target,则直接返回
if (values.get(neighbor) == target) {
return neighbor;
}
// 否则加入队列以便下次访问,并记录其已被访问过
queue.offer(neighbor);
visited.add(neighbor);
}
}
}
return null;
}
}
class UndirectedGraphNode {
int label;
ArrayList<UndirectedGraphNode> neighbors;
UndirectedGraphNode(int x) {
label = x;
neighbors = new ArrayList<>();
}
}
时空复杂度
O
(
N
+
E
)
O(N+E)
O(N+E)。注意visited.add(neighbor);
这句话的位置,在访问neighbor的同时应该立即将其加入visited,以防后面重复访问的浪费。