A zero-indexed array A consisting of N different integers is given. The array contains all integers in the range [0, N - 1].
Sets S[K] for 0 <= K < N are defined as follows:
S[K] = { A[K], A[A[K]], A[A[A[K]]], ... }.
Sets S[K] are finite for each K and should NOT contain duplicates.
Write a function that given an array A consisting of N integers, return the size of the largest set S[K] for this array.
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 array A is an integer within the range [0, N-1].
我的方法:用了递归,结果超时
public class Solution {
//0 2 1
public int count(int[] nums,int index, int cur){
if(nums[nums[cur]]==index) return 1;
return 1+count(nums, index, nums[cur]);
}
public int arrayNesting(int[] nums) {
int[] res = new int[nums.length];
int max;
for(int i=0; i<res.length; i++){
res[i]=1;
}
for(int i=0; i<nums.length; i++){
if(nums[i]==i) continue;
else{
res[i]=1+count(nums, i, i);
}
}
max=res[0];
for(int i=1; i<res.length;i++){
if(res[i]>max)
max=res[i];
}
return max;
}
}
应该要选用合适的数据结构来辅助算法。HashSet
public class Solution {
HashSet<Integer> set = new HashSet();
public int arrayNesting(int[] nums) {
int res=0;
for(int i=0; i<nums.length; i++){
res=Math.max(res,check(nums[i],nums));
}
return res;
}
public int check(int k, int[] nums){
int count=0;
while(!set.contains(k)){
count++;
set.add(k);
k=nums[k];
}
return count;
}
}
这里的HashSet里面最终会装满nums里面全部的值。注意check函数里面最开始是把count初始化为0的。
还有,注意这两个方法中存储最大值max的方法,后者比较好。
方法三
int arrayNesting(vector<int>& nums) {
if(nums.empty()) return 0;
int ret_size = 0;
for(int i=0; i<nums.size(); i++){
if(nums[i] < 0) continue;
int cur = nums[i];
nums[i] = -nums[i];
set<int> st;
while(!st.count(cur) && cur >= 0){
st.insert(cur);
int temp = nums[cur];
nums[cur] = -nums[cur];
cur = temp;
}
if(st.size() > ret_size) ret_size = st.size();
}
return ret_size;
}