Leetcode: Longest Consecutive Sequence

本文转自: http://hombo.wang/leetcode/2014/10/06/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.

此题可以用hashmap在O(n) 时间复杂度解决。

一看是无需数组,又要求O(n)复杂度实现,很自然的可以想到用hashmap。

具体方法就是将数组全部hash了,然后在对数组的每个元素进行一边查找,

例如对于数组的第i个数,我们不断判断num[i]+1是否在hash表里,如果在说明数组存在比num[i]大1的数,然后继续判断num[i]+2……直到num[i]+k不再hash表里位置,在这个过程中需要记录长度。

只用上面的算法不能保证是O(n)的,看下面的例子


 
 
  1. 数组是 `[7,6,5,4,3]`
  2.  
  3. 查找过程是:
  4.  
  5. 7: `7`
  6. 6: `6,7`
  7. 5: `5,6,7`
  8. 4: `4,5,6,7`
  9. 3: `3,4,5,6,7`

显然复杂度最坏未为O(n^2), 了保证算法是O(n)的,我们要用一些小技巧,让数组中已经被判断过的数不再去判断,其实很简单,就是加一个标示,表示这个数是否在前面的数里面判断过了,我们还可以将每次判断出来的长度存在这次判断最开始的那个数的hashmap中,这样下次如果加到这个数的时候,可以直接用这个长度值,而不需要往后遍历了,例如


 
 
  1. 5: 5,6,7 把长度3存在hashmap : <5,3>
  2. 4: 4,5,6,7 4 上加到5的时候,可以从<5,3>直到5后面连续的长度是3,就不用再遍历了。

这样就可以保证算法是O(n)的了,空间复杂度是hash表大小。

AC代码如下:


 
 
  1. class Solution {
  2. public:
  3. int longestConsecutive(vector<int> &num) {
  4. unordered_map<int,int> hash;
  5. int max = 0,count,j;
  6. unordered_map<int,int>::iterator it;
  7. for(int i = 0 ; i < num.size(); ++i) hash.insert({num[i],-1});
  8. for(int i = 0 ; i < num.size(); ++i){
  9. if(hash.find(num[i])->second!=-1) continue;
  10. count = 1;
  11. j = num[i]+1;
  12. while((it=hash.find(j++))!=hash.end()){
  13. if(it->second > 0){
  14. count += it->second;
  15. break;
  16. }
  17. it->second = 0;
  18. ++count;
  19. }
  20. hash.find(num[i])->second = count;
  21. if(max < count) max = count;
  22. }
  23. return max;
  24. }
  25. };

另外,还有一种算法是同时从num[i]的两边不断判断,并标记已经判断过的的数,这种方法可以省去一些长度的记录。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值