列表

详情


565. 数组嵌套

索引从0开始长度为N的数组A,包含0N - 1的所有整数。找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], ... }且遵守以下的规则。

假设选择索引为i的元素A[i]S的第一个元素,S的下一个元素应该是A[A[i]],之后是A[A[A[i]]]... 以此类推,不断添加直到S出现重复的元素。

 

示例 1:

输入: A = [5,4,0,3,1,6,2]
输出: 4
解释: 
A[0] = 5, A[1] = 4, A[2] = 0, A[3] = 3, A[4] = 1, A[5] = 6, A[6] = 2.

其中一种最长的 S[K]:
S[0] = {A[0], A[5], A[6], A[2]} = {5, 6, 2, 0}

 

提示:

相似题目

嵌套列表权重和

扁平化嵌套列表迭代器

加权嵌套序列和 II

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int arrayNesting(vector<int>& nums) { } };

python3 解法, 执行用时: 216 ms, 内存消耗: 22.4 MB, 提交时间: 2022-11-29 12:30:36

class Solution:
    def arrayNesting(self, nums: List[int]) -> int:
        ans, n = 0, len(nums)
        for i in range(n):
            cnt = 0
            while nums[i] < n:
                num = nums[i]
                nums[i] = n
                i = num
                cnt += 1
            ans = max(ans, cnt)
        return ans

golang 解法, 执行用时: 100 ms, 内存消耗: 9 MB, 提交时间: 2022-11-29 12:30:22

func arrayNesting(nums []int) (ans int) {
    n := len(nums)
    for i := range nums {
        cnt := 0
        for nums[i] < n {
            i, nums[i] = nums[i], n
            cnt++
        }
        if cnt > ans {
            ans = cnt
        }
    }
    return
}

javascript 解法, 执行用时: 92 ms, 内存消耗: 50.9 MB, 提交时间: 2022-11-29 12:30:05

/**
 * @param {number[]} nums
 * @return {number}
 */
var arrayNesting = function(nums) {
    let ans = 0, n = nums.length;
    for (let i = 0; i < n; ++i) {
        let cnt = 0;
        while (nums[i] < n) {
            const num = nums[i];
            nums[i] = n;
            i = num;
            ++cnt;
        }
        ans = Math.max(ans, cnt);
    }
    return ans;
};

javascript 解法, 执行用时: 108 ms, 内存消耗: 52.8 MB, 提交时间: 2022-11-29 12:29:53

/**
 * @param {number[]} nums
 * @return {number}
 */
var arrayNesting = function(nums) {
    let ans = 0, n = nums.length;
    const vis = new Array(n).fill(0);
    for (let i = 0; i < n; ++i) {
        let cnt = 0;
        while (!vis[i]) {
            vis[i] = true;
            i = nums[i];
            ++cnt;
        }
        ans = Math.max(ans, cnt);
    }
    return ans;
};

golang 解法, 执行用时: 92 ms, 内存消耗: 8.4 MB, 提交时间: 2022-11-29 12:29:38

func arrayNesting(nums []int) (ans int) {
    vis := make([]bool, len(nums))
    for i := range vis {
        cnt := 0
        for !vis[i] {
            vis[i] = true
            i = nums[i]
            cnt++
        }
        if cnt > ans {
            ans = cnt
        }
    }
    return
}

python3 解法, 执行用时: 240 ms, 内存消耗: 25.7 MB, 提交时间: 2022-11-29 12:29:22

class Solution:
    def arrayNesting(self, nums: List[int]) -> int:
        ans, n = 0, len(nums)
        vis = [False] * n
        for i in range(n):
            cnt = 0
            while not vis[i]:
                vis[i] = True
                i = nums[i]
                cnt += 1
            ans = max(ans, cnt)
        return ans

上一题