题目链接
分析
遍历每一个节点,并且记录下遍历到的时间
由于每一个节点只有一个出边,那么从任意节点开始遍历,都会出现以下三种情况中的一种:
(1) 走到一个没有出边的节点
(2) 走到一个遍历过的节点,但该节点在之前的遍历中就已经访问过
(3) 走到一个遍历过的节点,该节点在这次遍历中访问过
对于前两种情况来说,可以直接结束循环
对于第三种情况来说,设该节点第一次被遍历到的时间为 $a$ ,第二次时间为 $b$,那么我们找到了一个长度为 $b- a$ 的环
代码实现
class Solution {
public:
int longestCycle(vector<int>& edges) {
int n = edges.size();
int ans = -1;
int cur_time = 0;
vector<int> times(n);
for(int i = 0; i < n; ++i) {
if(times[i])
continue;
int u = i, start_time = cur_time;
while(u != -1) {
cur_time++;
if(times[u]) {
if(times[u] > start_time) {
ans = max(ans, cur_time - times[u]);
}
break;
}
times[u] = cur_time;
u = edges[u];
}
}
return ans;
}
};
复杂度分析
- 时间复杂度:$O(n)$,我们只访问每个节点一次
- 空间复杂度:$O(n)$