【Leetcode】128.最長連續序列

題目

給定一個未排序的整數數組,找出最長連續序列的長度。java

要求算法的時間複雜度爲 O(n)面試

示例:算法

輸入: [100, 4, 200, 1, 3, 2]
輸出: 4
解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度爲 4。

題解

這道題目最開始你們想的確定是sort,而後計數計算最長序列。可是要求時間複雜度爲:o(n),就不能用sort了。通常在leetcode中,對時間複雜度有要求,就用空間來換,對空間複雜度有要求,就用時間來換。數組

基於這種思路咱們就想要求最長的,就是要記錄下有沒有相鄰的元素,好比遍歷到100這個元素,咱們須要查看[99, 101]這兩個元素在不在序列中,這樣去更新最大長度。而記錄元素有沒有這個事咱們太熟悉了,用set這種數據結構,而set這種數據結構是須要o(n)的空間來換取的,這就是咱們剛纔說的用空間來換時間。數據結構

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> numsSet = new HashSet<>();
        for (Integer num : nums) {
            numsSet.add(num);
        }
        int longest = 0;
        for (Integer num : nums) {
            if (numsSet.remove(num)) {
                // 向當前元素的左邊搜索,eg: 當前爲100, 搜索:99,98,97,...
                int currentLongest = 1;
                int current = num;
                while (numsSet.remove(current - 1)) current--;
                currentLongest += (num - current);
                                // 向當前元素的右邊搜索,eg: 當前爲100, 搜索:101,102,103,...
                current = num;
                while(numsSet.remove(current + 1)) current++;
                currentLongest += (current - num);
                        // 搜索完後更新longest.
                longest = Math.max(longest, currentLongest);
            }
        }
        return longest;
    }
}

熱門閱讀

Leetcode名企之路

相關文章
相關標籤/搜索