LC565 - Array Nesting

Description

You are given an integer array nums of length n where nums is a permutation of the numbers in the range [0, n - 1].
You should build a set s[k] = {nums[k], nums[nums[k]], nums[nums[nums[k]]], … } subjected to the following rule:
The first element in s[k] starts with the selection of the element nums[k] of index = k.
The next element in s[k] should be nums[nums[k]], and then nums[nums[nums[k]]], and so on.
We stop adding right before a duplicate element occurs in s[k].
Return the longest length of a set s[k].

Example 1:
Input: nums = [5,4,0,3,1,6,2]
Output: 4
Explanation:
nums[0] = 5, nums[1] = 4, nums[2] = 0, nums[3] = 3, nums[4] = 1, nums[5] = 6, nums[6] = 2.
One of the longest sets s[k]:
s[0] = {nums[0], nums[5], nums[6], nums[2]} = {5, 6, 2, 0}

Example 2:
Input: nums = [0,1,2]
Output: 1
Constraints:
1 <= nums.length <= 105
0 <= nums[i] < nums.length
All the values of nums are unique.

Solution

You can simulate directly according to the meaning of the question.

  • traverse each nums[i] from front to back
  • in order to prevent some rings from being repeated Processing, for the current passing nums[i] is marked as −1, so that each number is accessed no more than 3 times, and the overall complexity is O(n).
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # O(n) time | O(1) space
    class Solution:
    def arrayNesting(self, nums: List[int]) -> int:
    n = len(nums)
    ans = 0
    for i, v in enumerate(nums):
    if v == -1:
    continue

    c, cur = i, v
    cnt = 0
    while cur != -1:
    nums[c] = -1
    c, cur = cur, nums[cur]
    cnt +=1
    ans = max(ans, cnt)
    return ans