Leetcode 128. 最長連續序列 DP

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

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

示例:

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

兩種方法,一種map,一種set。

map注意除重。

class Solution {
public:
    int longestConsecutive(vector<int>& nums) 
    {
        int res=0;
        unordered_set<int>s(nums.begin(),nums.end());
        for(int val:nums)
        {
            if(!s.count(val))
                continue;
            s.erase(val);
            int pre=val-1,next=val+1;
            while(s.count(pre))
                s.erase(pre--);
            while(s.count(next))
                s.erase(next++);
            res=max(res,next-pre-1);
        }
        return res;
    }
};

set的方法,用兩個指針pre,next分別向兩邊掃,記錄一個next-pre-1的最大值即可

class Solution {
public:
    int longestConsecutive(vector<int>& nums) 
    {
        int res=0;
        map<int,int>m;
        for(int num:nums)
        {
            if(m.count(num))
                continue;
            int left=m.count(num-1)?m[num-1]:0;
            int right=m.count(num+1)?m[num+1]:0;
            int sum=right+left+1;
            m[num]=sum;
            res=max(res,sum);
            m[num-left]=sum;
            m[num+right]=sum;
        }
        return res;
    }
};

map的方法,分別找當前值得左邊和右邊極限,兩邊端點和當前值設置成left+right+1.
如果該值處理過了,就不在處理(set有除重機制)

 

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