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

本文详细解析LeetCode上编号为565的题目“数组嵌套”。该题要求找出给定数组中最长的不重复元素序列。文章提供了问题背景、示例及解题思路,采用了一种标记已访问元素的方法来避免重复计算,最终通过遍历每个元素确定最长序列长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值