暴力找环的题,重点是用一个unordered_set来记录当前数字是否被访问过了,如果没有就继续往后,如果被访问过了,就结束这条路径的查找,用当前路径长度来更新maxn
unordered_set是全局的!!不是局部的,不是每次来一个新起点就维护一个unordered_set,全局的话就可以记录013这种路径,你到1就不会再次进入这次循环了,因为这是重复搜索了
class Solution {
public:
int arrayNesting(vector<int>& nums) {
//以每个下标为起点向后遍历,如果重复了,或者越界了就停止,维护一个最大值
//用一个unordered_set来记录出现过的数字,这样查找就是O(1)时复
int maxn = 0;
//不用每个数字都开始搜索,比如013这种,那么从1开始就是13,防止重复搜索,外部维护一个unordered_set就行了,因为不用每个数字都重新从头搜索,不是内部创建unordered_set的
unordered_set<int> se;
for(int i = 0; i < nums.size(); ++i){
int tmp = i;
int loop = 0;
while(se.find(tmp) == se.end()){
se.insert(tmp);
tmp = nums[tmp];
loop++;
}
maxn = max(loop,maxn);
}
return maxn;
}
};