565. Array Nesting(python+cpp)
阿新 • • 發佈:2018-11-23
題目:
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都超時了。