使用一个标记是否已经走过的数组,来统计是否已经走过
class Solution {
public int arrayNesting(int[] nums) {
int n = nums.length;
// 记录是否访问下标
boolean[] vis = new boolean[n];
int res = 0;
for (int i = 0; i < n; i++){
int count = 0;
int cur = i;
// 遍历这个环,统计这个环的大小
while (!vis[cur]){
vis[cur] = true;
count++;
cur = nums[cur];
}
res = Math.max(res, count);
}
return res;
}
}
优化:不使用数组,使用原地标记
class Solution {
// 原地标记没因为nums里面的数据是在nums.length里面的,那么也就是说,走过的点,我们可以把他修改掉
public int arrayNesting(int[] nums) {
int res = 0, n = nums.length;
for (int i = 0; i < n; i++){
int count = 0;
int cur = i;
while (nums[cur] < n){
count++;
int temp = nums[cur];
// 修改值,让这个值变成已经走过了
nums[cur] = n;
cur = temp;
}
res = Math.max(res, count);
}
return res;
}
}
时间复杂度:o(n) 空间复杂度: o(1)