[LeetCode]Longest Consecutive Sequence


題目大意

給定一個整形數組,求出最長的連續序列。例如數組[100,4,200,1,3,2],最長的連續序列長度為[1,2,3,4],長度為4。要求時間復雜度為O(n)。

 

思路

  1. "排序轉換成經典的動態規划問題"的話排序至少需要時間復雜度為O(nlog(n))——pass
  2. 利用c++中的set,直接會排序,並且沒有重合的,但是set背后實現的原理牽扯到紅黑樹,時間復雜度不滿足——pass
  3. 建立hash索引,把查找的元素周圍的都訪問個遍,求出個臨時最大值跟全局最大值比較。當再次訪問該段的元素的時候,直接跳過。這樣保證時間復雜度為O(n),c++11中數據結構為unordered_set,保證查找元素的時間復雜度為O(1).

偽代碼

建立無序集合existSet visitedSet分別表示原集合中包含的元素和已經訪問了的元素
全局最大個數maxLen
順序遍歷原集合中的元素
    臨時計數count=1 如果該元素在visitedSet,停止往下執行,進行下一次循環
  否則,把改元素小的並且在existSet中的元素存放在visitedSet中,count++
         把改元素大的並且在existSet中的元素存放在visitedSet中, count++
    maxLen = max(maxLen, count)

 

參考代碼

class Solution {
public:
    int longestConsecutive(vector<int> &num) {
        if(num.empty())
            return 0;
        unordered_set<int> existSet;
        unordered_set<int> visitedSet;
        int maxLen;
        for(int i = 0; i < num.size(); ++i)
            existSet.insert(num[i]);
        for(int i = 0; i < num.size(); ++i)
        {
            if(visitedSet.find(num[i]) != visitedSet.end())
                continue;
            int count = 1;
            int left = num[i];
            while(existSet.find(--left) != existSet.end())
            {
                ++count;
                visitedSet.insert(left);
            }
            int right = num[i];
            while(existSet.find(++right) != existSet.end())
            {
                ++count;
                visitedSet.insert(right);
            }
            maxLen = maxLen > count ? maxLen : count;
        }
        return maxLen;
    }
};

 


免責聲明!

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



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