难度:中等
题目:
索引从0开始长度为N的数组A,包含0到N - 1的所有整数。找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], … }且遵守以下的规则。
假设选择索引为i的元素A[i]为S的第一个元素,S的下一个元素应该是A[A[i]],之后是A[A[A[i]]]… 以此类推,不断添加直到S出现重复的元素。
示例 1:
输入: A = [5,4,0,3,1,6,2]
输出: 4
解释:
A[0] = 5, A[1] = 4, A[2] = 0, A[3] = 3, A[4] = 1, A[5] = 6, A[6] = 2.
其中一种最长的 S[K]:
S[0] = {A[0], A[5], A[6], A[2]} = {5, 6, 2, 0}
提示:
N是[1, 20,000]之间的整数。
A中不含有重复的元素。
A中的元素大小在[0, N-1]之间。
思路:第一种思路是暴力解法,但是这样会超出时间限制;因此对其进行优化。嵌套数组退出循环的条件是出现重复的。也就是说形成一个环时,就会退出。所以建立一个visited数组,用于记录访问过的数组(访问过的下次就不需要在访问,因为会进入同一个环,重复计算)。
public int arrayNesting(int[] nums){
boolean[] visited = new boolean[nums.length];
int res=0;
for(int i=0;i<nums.length;i++){
if(!visited[i]){
int start = nums[i],count=0;
do{
start=nums[start];
count++;
visited[start]=true;
}while (start != nums[i]);
res=Math.max(res,count);
}
}
return res;
}