[leetcode]Longest Consecutive Sequence


最近經常閑的無聊,於是就做做leetcode的題了,目測好像都不是很難.

不過呢,閑的無聊還是記錄下某些做了的題.

 

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

For example,
Given [100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

Your algorithm should run in O(n) complexity.

 

一看呢,就是排序,然后找就好了,但是要求是O(n),排序明顯是個O(n*logn)的算法.

只是找連續的嘛,我們可以把所有的數字都存入hash表,然后隨意從某個數字開始找他的前面和后面那個是否存在.

然后得到一個最大的長度.當然找過的就可以刪掉了...你想,一個連續的序列,你從中間任意位置開始往兩邊找不都一樣么.

所以只要找過就可以刪掉了.

 

class Solution {
public:
    set<int> flag;
    int findBound(int n , bool asc){
        int ans = 0;
        set<int>::iterator iter;
        while((iter = flag.find(n)) != flag.end()){
            flag.erase(iter);
            ans ++;
            if(asc) n-- ; else n++;
        }
        return ans;
    }
    int longestConsecutive(vector<int> &num) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
            
        int ans = 0;
        flag.clear();
        for(int i = 0 ; i < num.size() ; i++)
           flag.insert(num[i]);
        for(int i = 0 ; i < num.size(); i++){
            ans = max(findBound(num[i],true) + findBound(num[i]+1,false) , ans); 
        }
        return ans;
    }
};

  ----update----

class Solution {
public:
    int longestConsecutive(vector<int> &num) {
        s.clear();
        for (int i = 0; i < num.size(); i++) {
            s.insert(num[i]);
        }
        int ans = 0;
        for (int i = 0; i < num.size(); i++) {
            ans = max(ans, bound(num[i], true) + bound(num[i] + 1, false));
        }
        return ans;
    }
private:
    unordered_set<int> s;
    int bound(int num, bool asc) {
        int cnt = 0;
        for (auto iter = s.find(num); iter != s.end(); iter = s.find(num)) {
            s.erase(iter);
            if (asc) num--; else num++;
            cnt++;
        }
        return cnt;
    }
};

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM