qingcheng奕  

http://oj.leetcode.com/problems/longest-consecutive-sequence/ 

起初想的是排序,查了下O(n)的排序算法有计数排序、基数排序、桶排序。后来考虑到数据的范围不知道,并且还有可能是负数,这几种方法都不太适用。

之后想到了容器,Map、Set的查找是哈希查找,复杂度为O(1).

#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;

class Solution {
public:
    unordered_set<int> dict;

    int findLongestConsective(int num)
    {
        int ans = 0;
        int temp = num;
        //往上找
        while(dict.find(temp)!=dict.end())
        {
            ans++;
            dict.erase(temp);
            temp++;
        }
        //往下找
        while(dict.find(num-1)!=dict.end())
        {
            ans++;
            dict.erase(num-1);
            num--;
        }
        return ans;
    }
     int longestConsecutive(vector<int> &num) {
        
        for(int i = 0;i<num.size();i++)
            dict.insert(num[i]);

        int maxLen = 0;
        for(int i = 0;i<num.size();i++)
        {
            int t = findLongestConsective(num[i]);
            if(t>maxLen)
                maxLen = t;
        }
        return maxLen;
    }
};

int main()
{
    vector<int> num;
    num.push_back(100);
    num.push_back(4);
    num.push_back(200);
    num.push_back(1);
    num.push_back(3);
    num.push_back(2);
    Solution myS;
    int ans = myS.longestConsecutive(num);
    cout<<ans<<endl;
}

重点是思路的转换,以及 set 的应用。

posted on 2014-01-15 16:41  qingcheng奕  阅读(128)  评论(0编辑  收藏  举报