【LeetCode】565. Array Nesting(数组嵌套)

【LeetCode】565. Array Nesting(数组嵌套)

题目链接: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:

  1. N is an integer within the range [1, 20,000].
  2. The elements of A are all distinct.
  3. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值