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 的应用。