leetcode六月每日一題 leetcode128

在這裏插入圖片描述

這道題一拿到手首先想的是排序一下,然後再遍歷一遍數組,來找出最長連續子序列,但是這個時間複雜度最低也是o(logn)級別的,題中要求是o(n)級別的算法,所以不太行。

我還想到了一個,用下標數組的方法,最後也是隻掃描兩遍數組。但是這道題的話,沒有告訴數組中元素的範圍,所以不太好確定下標數組的長度,很明顯也不是用這種方法來做。

官方的一個思路是,先將數組中的元素存入查找表中,然後每一次枚舉該元素能延伸多長的序列(因爲用了查找表,所以每一次枚舉查找比較快),但是這中間有很多重複的計算,所以,在枚舉之前,要先看這個元素其前綴是否在查找表中,如果在就證明之前已經枚舉過這個元素了,就跳過,枚舉下一個。

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {

        unordered_set<int> num_set;
        for(const int& num : nums)
            num_set.insert(num); //先將數組中的元素放入查找表中

        int longestStreak = 0;

        for(const int& num : num_set){
            if(!num_set.count(num - 1)){ //查找其前綴是否存在,如不存在才進行判斷
                int currentNum = num;
                int currentStreak = 1;

                while(num_set.count(currentNum + 1)){ //枚舉看能到多長的序列
                    currentNum += 1;
                    currentStreak += 1;
                }

                longestStreak = max(longestStreak,currentStreak);


            }
        }


        return longestStreak;

    }
};

其實感覺今天這一道困難比昨天那一道簡單還好理解一點。。。

最近有點太浪了啊,都已經6.6號了。明天要打起精神學習啊!!!

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