题目链接:https://leetcode.com/problems/array-nesting/description/
难度:中
题目描述:A zero-indexed array A of length N contains all integers from 0 to N-1. Find and return the longest length of set S, where S[i] = {A[i], A[A[i]], A[A[A[i]]], ... } subjected to the rule below.
Suppose the first element in S starts with the selection of element A[i] of index = i, the next element in S should be A[A[i]], and then A[A[A[i]]]… By that analogy, we stop adding right before a duplicate element occurs in S.
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 of A are all distinct.
- Each element of A is an integer within the range [0, N-1].
解释:
索引从0开始的数组A包含N个不同的数字。每个数字范围[0, N - 1]
定义集合S[K] 对于 0 <= K < N:
S[K] = { A[K], A[A[K]], A[A[A[K]]], ... }
对于每一个K,S[K]是有限的,不包含重复。
编写函数返回最大的S[K]的大小。
思路:数组S一定会是一个或几个环,不可能不成环,也不可能会有除了环以外的元素。
“My initial idea is mark visited number for each start and clear out the mark before loop next start point, got TLE obviously…
The trick part here is that the numbers are always form a ring, and no matter which number of this ring you start with total count will always be same, so no need to step on it one more time…”,所以,只要把所有元素标记完,剩下的都会重复之前的环,就不用(每次只标记第一个,完成这行后,再复原了)。
代码:C++同Java
class Solution {
public int arrayNesting(int[] nums) {
int n=nums.length;
int maxsize=0;
for(int i=0;i<n;i++)
{
int size=0;
for(int k=i;nums[k]>=0;size++)
{
int numk=nums[k];
nums[k]=-1;
k=numk;
}
maxsize=Integer.max(maxsize,size);//C++:max(maxsize,size)
}
return maxsize;
}
}
日期:2018/2/21-14:01