【Lintcode】989. Array Nesting

題目地址:

https://www.lintcode.com/problem/array-nesting/description

給定一個長度爲NN的數組AA,內容是0N10\sim N-1(順序可能是亂的)。現在令S[i]={A[i],A[A[i]],A[A[A[i]]],...}S[i]=\{A[i],A[A[i]], A[A[A[i]]],...\},求maxiS[i]\max_i|S[i]|

思路是枚舉每一個ii,同時用一個哈希表記錄S[i]S[i]裏的數字以便於查重,然後分別計算S[i]|S[i]|。代碼如下:

import java.util.HashSet;
import java.util.Set;

public class Solution {
    /**
     * @param nums: an array
     * @return: the longest length of set S
     */
    public int arrayNesting(int[] nums) {
        // Write your code here
        int res = 1;
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
        	// 如果已經含有當前數了,說明之前算過,那就不用算了
            if (set.contains(nums[i])) {
                continue;
            }
            
            int cur = nums[i], len = 0;
            while (!set.contains(cur)) {
                set.add(cur);
                cur = nums[cur];
                // 累加長度
                len++;
            }
            
            res = Math.max(res, len);
        }
        
        return res;
    }
}

時空複雜度O(n)O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章