题目地址
题目描述
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:
1 | Input: A = [5,4,0,3,1,6,2] |
Note:
- N is an integer within the range [1, 20,000].
- The elements of A are all distinct.
- Each element of A is an integer within the range [0, N-1].
解题思路
题目中定义集合S[i]= {A[i], A[A[i]], A[A[A[i]]], … },即以A[i]开头的满足A[i],A[A[i]]…最终满足A[A[..A[i]]]=i的一个集合。求从S[0]到S[N-1]种集合大小最大的值。
刚开始我使用递归直接求从0到N-1每一个集合的大小进行比较,思路可行但是出现时间超限,于是定义了数组isVisted来判定当前值是否访问过,如果访问过说明从这里开始的集合已经被另一个集合包括了(即A[0]=1,那么S[1]一定是S[0]的子集)。
解体代码【.CPP】
1 | class Solution { |