周赛的第三题,算是比较简单的mid了吧,可能别人会有更优的思路,过一段时间回来再看看。
解题思路
分析给定的两个节点的可达节点,然后记录下来对应的边数。
如果对于某个节点,这两个节点都可达,则记录下来对应的较大值;对于所有的节点,依次更新这个较大值,并记录当前值所对应的节点即可。
代码
class Solution {
public int closestMeetingNode(int[] edges, int node1, int node2) {
int[] r1 = reach(node1, edges);
int[] r2 = reach(node2, edges);
int min = Integer.MAX_VALUE;
int ans = -1;
for (int i = 0; i < edges.length; i++) {
if (r1[i] == -1 || r2[i] == -1) continue;
int t = Math.max(r1[i], r2[i]);
if (t < min) {
min = t;
ans = i;
}
}
return ans;
}
//返回的数组记录了这个节点可以到达的元素的边数
public int[] reach(int node, int[] edges) {
int[] r = new int[edges.length];
int cur = node;
int next = edges[node];
int len = 0;
//如果某个节点已经遍历过,就退出,防止死循环
while (next != -1 && r[next] == 0) {
len++;
node = next;
next = edges[next];
r[node] = len;
}
for (int i = 0; i < edges.length; i++) {
//针对自身可能会有环
if (i == cur) r[i] = 0;
else if (r[i] == 0) r[i] = -1;
}
return r;
}
}