LeetCode - 565. Array Nesting

解题代码:

classSolution {

public:

    int arrayNesting(vector<int>&nums) {

        int n=nums.size();

        int res=0;

        for(int i=0;i<n;i++){

            if(nums[i]!=n){

                int count=0;

                int t=i;

                while(nums[t]!=n){

                    count++;

                    int k=nums[t];

                    nums[t]=n;

                    t=k;

                }

                res=max(res,count);

            }

        }

        return res;

    }

};

 

 

 

解题思路:

题目中有一个数组nums[n],里面分别是0~n-1这n个整数,并且是随机分布的。而实际上题目中所说的S[k],指的就是对于任何一个属于S[k]的元素a,nums[a]也都必然在S[k]中,并且去掉S[k]中任何元素,都将使得上述条件不满足。而题目要求的就是最大的S[k]的元素个数。

于是乎,我从0开始,对于每个0≤i≤n-1,都找到nums[i], nums[nums[i]], nums[nums[nums[i]]]……直至找到i,则这些元素组合起来就是S[i],而根据定义,也等于S[nums[i]],S[nums[nums[i]]]……为了避免重复操作,在每找到一个S[i]中的元素时,我将其赋值为n,使得我在下次遇到的时候不需要做无用功。然后把找到的S[i]中的元素个数进行相比,得出最大的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值