版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21275321/article/details/84324887
题目:
A zero-indexed array
A
of lengthN
contains all integers from0
toN-1
. Find and return the longest length of setS
, where S[i] = {A[i], A[A[i]], A[A[A[i]]], … } subjected to the rule below.
Suppose the first element inS
starts with the selection of elementA[i]
ofindex = i
, the next element inS
should beA[A[i]]
, and thenA[A[A[i]]]
… By that analogy, we stop adding right before a duplicate element occurs inS
.
Example 1:Input: A = [5,4,0,3,1,6,2] Output: 4 Explanation: A[0] =5, A[1] = 4, A[2] = 0, A[3] = 3, A[4] = 1, A[5] = 6, A[6] = 2. One of the longest S[K]: S[0] = {A[0], A[5], A[6], A[2]} = {5, 6, 2, 0}
Note:
N
is an integer within the range[1, 20,000]
.
The elements ofA
are all distinct.
Each element ofA
is an integer within the range[0, N-1]
.
解释:
注意,开始出现循环的时候就结束,结束的条件就是next==i
。
python代码:
class Solution(object):
def arrayNesting(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
_max=0
list_set=set()
for i, num in enumerate(nums):
if num not in list_set:
list_set.add(num)
count=1
next=num
#如果满足条件则会回到原点
while next!=i:
next=nums[next]
list_set.add(next)
count+=1
_max=max(_max,count)
return _max
c++代码:
#include <set>
using namespace std;
class Solution {
public:
int arrayNesting(vector<int>& nums) {
int maxLen=1;
int n=nums.size();
vector<bool> visited(n,false);
for (int i=0;i<n;i++)
{
int next=nums[i];
int _count=1;
if(!visited[next])
{
visited[next]=true;
while (next!=i)
{
next=nums[next];
visited[next]=true;
_count++;
}
maxLen=max(maxLen,_count);
}
}
return maxLen;
}
};
总结:
发现了一个规律,就是c++用vector<bool>
作为visited
比用set<int>
作为visited
速度更快,好几次用set都超时了。