LeetCode565. 数组嵌套


LeetCode565. 数组嵌套

题目描述

本题目来自LeetCode上的『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}

提示
  • N[1, 20,000]之间的整数。
  1. A中不含有重复的元素。
  2. A中的元素大小在[0, N-1]之间。

题解

将数组中的每个元素看作图的一个顶点,数组中的所有元素都不重复,说明每个顶点的入度和出度都为 $1$,因此这个图是由若干个环组成。

遍历这些环,找出最长的即可。可以使用一个数组标记已经遍历过的顶点,也可以将遍历过的元素值设置为值域 $[1,20000]$ 以外的值作为标记,由于每个环都不与其他环相交,因此不需要考虑数据复原的问题。

代码

class Solution {
public:
    int arrayNesting(vector<int> &nums) {
        int ans = 0, n = nums.size();
        for (int i = 0; i < n; ++i) {
            int cnt = 0;
            while (nums[i] < n) {
                int t = nums[i];
                nums[i] = 1e9;
                i = t;
                ++cnt;
            }
            ans = max(ans, cnt);
        }
        return ans;
    }
};

复杂度分析

  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(1)$

文章作者: xitie2000
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xitie2000 !
评论
  目录