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]之间。

思路:

时间复杂度:O(n),空间复杂度O(n)

用dp来做,用递归dp

代码:

func arrayNesting(nums []int) int {
    n := len(nums)
    arr := make([]int, n)
    var res int
    var dp func(arr []int,start,i int)int
    dp = func(arr []int,start,i int)int{
        if nums[i] == start{
            arr[i] = 1
            return 1
        }
        if arr[i] !=0 {
            return arr[i]
        }else{
            arr[i] = dp(arr,start,nums[i])+1
            return arr[i]
        }
    }
    for i:=0;i<n;i++{
        arr[i] = dp(arr,i,i)
        if res < arr[i]{
            res = arr[i]
        }
    }
    return res
}

代码效率:

执行用时:124 ms, 在所有 Go 提交中击败了33.33%的用户
内存消耗:15.9 MB, 在所有 Go 提交中击败了9.52%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!