[leetcode] Longest Consecutive Sequence

最初的想法是使用一个数组dp[1000]记录每个数字是否出现过,然后从小到大遍历一遍查找,看了测试数据后(数据太大),感觉这种方法不可行。实在想不出来了,参看了discuss,发现他们都是用容器实现的,首先将元素映射过去,然后判断左边和右边元素是否在map中,并且和以前的元素是否连续,这样进行之后,将访问过的元素标记为0.z这种方法是可以达到O(n)的。所以,以后想不出来的时候,试着去用一下容器。

[cpp]  view plain copy
  1. class Solution {  
  2. public:  
  3.     map<int,int> mp;  
  4.     int longestConsecutive(vector<int> &num) {  
  5.         // Start typing your C/C++ solution below  
  6.         // DO NOT write int main() function  
  7.         int i,j;  
  8.         for(i=0;i<num.size();i++)  
  9.             mp[num[i]]=1;  
  10.         int res=0;  
  11.         for(i=0;i<num.size();i++){  
  12.             int sum=1;  
  13.             if(mp.count(num[i])){  
  14.                 mp[num[i]]=0;  
  15.                 int left=num[i]-1;  
  16.                 while(mp.count(left)&&mp[left]!=0){  
  17.                     mp[left--]=0;  
  18.                     sum++;  
  19.                 }  
  20.                 int right=num[i]+1;  
  21.                 while(mp.count(right)&&mp[right]!=0){  
  22.                     mp[right++]=0;  
  23.                     sum++;  
  24.                 }  
  25.             }  
  26.             if(res<sum)  
  27.                 res=sum;  
  28.         }  
  29.         return res;  
  30.     }  
  31. };  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值