[LeetCode] Longest Consecutive Sequence

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表,然后随意从某个数字开始找他的前面和后面那个是否存在.

然后得到一个最大的长度.当然找过的就可以删掉了...你想,一个连续的序列,你从中间任意位置开始往两边找不都一样么.

所以只要找过就可以删掉了.

 1 class Solution {
 2 public:
 3     set<int> flag;
 4     int findBound(int n , bool asc){
 5         int ans = 0;
 6         set<int>::iterator iter;
 7         while((iter = flag.find(n)) != flag.end()){
 8             flag.erase(iter);
 9             ans ++;
10             if(asc) 
11                 n-- ;
12             else 
13                 n++;
14         }
15         return ans;
16     }
17     int longestConsecutive(vector<int> &num) {
18         // Start typing your C/C++ solution below
19         // DO NOT write int main() function
20              
21         int ans = 0;
22         flag.clear();
23         for(int i = 0 ; i < num.size() ; i++)
24            flag.insert(num[i]);
25         for(int i = 0 ; i < num.size(); i++){
26             ans = max(findBound(num[i],true) + findBound(num[i]+1,false) , ans); 
27         }
28         return ans;
29     }
30 };

下面用hash代替了set,思想一样,看上去没有上面的简洁

 1 class Solution {
 2 public:
 3     int longestConsecutive(vector<int> &num) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function
 6         map<int, int> hmap;
 7         hmap.clear();
 8         int n = num.size();
 9         for(int i=0; i<n; i++){
10             hmap.insert(pair<int, int>(num[i], i));
11         }
12         int ans=0, cnt=0;
13         map<int, int>::iterator it;
14         for(int i=0; i<num.size(); i++){
15             int cur = num[i];
16             it = hmap.find(num[i]);
17             cnt = 1;
18             if(it!=hmap.end()){
19                 map<int, int>::iterator iter;
20                 while(1){
21                     iter = hmap.find(++cur);
22                     if(iter==hmap.end())
23                         break;
24                     cnt++;    
25                     hmap.erase(iter);
26                 }
27                 cur=num[i];
28                 while(1){
29                     iter = hmap.find(--cur);
30                     if(iter==hmap.end())
31                         break;
32                     cnt++;    
33                     hmap.erase(iter);
34                 }
35                 if(ans<cnt)
36                     ans = cnt;           
37                 
38             }
39             
40         }
41         return ans;
42     }
43 };
原文地址:https://www.cnblogs.com/diegodu/p/3791119.html