LeetCode565. 数组嵌套
题目描述
本题目来自LeetCode上的『565. 数组嵌套』
索引从0
开始长度为N
的数组A
,包含0
到N - 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]
之间的整数。
A
中不含有重复的元素。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)$