Array Nesting

medium array dfs

Problem

Given a permutation nums of 0..n-1, define S(i) = {nums[i], nums[nums[i]], …}. Return max |S(i)|.

Inputnums = [5,4,0,3,1,6,2]
Output4
Indices form disjoint cycles; the answer is the longest cycle.

def array_nesting(nums):
    best = 0
    seen = [False] * len(nums)
    for i in range(len(nums)):
        if seen[i]: continue
        j = i; cnt = 0
        while not seen[j]:
            seen[j] = True
            j = nums[j]; cnt += 1
        best = max(best, cnt)
    return best
function arrayNesting(nums) {
  const seen = new Array(nums.length).fill(false);
  let best = 0;
  for (let i = 0; i < nums.length; i++) {
    if (seen[i]) continue;
    let j = i, cnt = 0;
    while (!seen[j]) { seen[j] = true; j = nums[j]; cnt++; }
    if (cnt > best) best = cnt;
  }
  return best;
}
class Solution {
    public int arrayNesting(int[] nums) {
        boolean[] seen = new boolean[nums.length];
        int best = 0;
        for (int i = 0; i < nums.length; i++) {
            if (seen[i]) continue;
            int j = i, cnt = 0;
            while (!seen[j]) { seen[j] = true; j = nums[j]; cnt++; }
            best = Math.max(best, cnt);
        }
        return best;
    }
}
int arrayNesting(vector& nums) {
    vector seen(nums.size(), false);
    int best = 0;
    for (int i = 0; i < (int)nums.size(); i++) {
        if (seen[i]) continue;
        int j = i, cnt = 0;
        while (!seen[j]) { seen[j] = true; j = nums[j]; cnt++; }
        best = max(best, cnt);
    }
    return best;
}
Time: O(n) Space: O(n)