1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public int closestMeetingNode(int[] edges, int node1, int node2) {
Map<Integer, Integer> reachableNode1 = new HashMap<>();
Map<Integer, Integer> reachableNode2 = new HashMap<>();
dfs(reachableNode1, node1, new boolean[edges.length], edges, 0);
dfs(reachableNode2, node2, new boolean[edges.length], edges, 0);
int distance = Integer.MAX_VALUE, targetNode = -1;
for (Map.Entry<Integer, Integer> entry : reachableNode1.entrySet()) {
int reachable1 = entry.getKey(), steps1 = entry.getValue();
if (reachableNode2.containsKey(reachable1)) {
int steps2 = reachableNode2.get(reachable1);
int currMax = Math.max(steps1, steps2);
if (currMax < distance || (currMax == distance && reachable1 < targetNode)) {
distance = currMax;
targetNode = reachable1;
}
}
}
return targetNode;
}

private void dfs(Map<Integer, Integer> nodeDistance, int currNode, boolean[] visited, int[] edges, int steps) {
visited[currNode] = true;
nodeDistance.put(currNode, steps);
int nextNode = edges[currNode];
if (nextNode != -1 && !visited[nextNode]) {
dfs(nodeDistance, nextNode, visited, edges, steps + 1);
}
}
}

用两个dfs知道node1和node2能到达的nodes有哪些(用两个map分别来存). 然后遍历一个map看该map中有的node另一个map有没有. 有的话记录此时的最大值然后和全局变量比较, 如果比全局变量小或者等于全局变量但是当前node的index比targetNode小, 此时更新全局变量和targetNode的值. 由于每个node往外最多只有一个edge, 于是用loop也能做.

时间复杂度: O(n)
空间复杂度: O(n)