Longest Consecutive Sequence
最初的想法是使用一个数组dp[1000]记录每个数字是否出现过,然后从小到大遍历一遍查找,看了测试数据后(数据太大),感觉这种方法不可行。实在想不出来了,参看了discuss,发现他们都是用容器实现的,首先将元素映射过去,然后判断左边和右边元素是否在map中,并且和以前的元素是否连续,这样进行之后,将访问过的元素标记为0.z这种方法是可以达到O(n)的。所以,以后想不出来的时候,试着去用一下容器。
·
最初的想法是使用一个数组dp[1000]记录每个数字是否出现过,然后从小到大遍历一遍查找,看了测试数据后(数据太大),感觉这种方法不可行。实在想不出来了,参看了discuss,发现他们都是用容器实现的,首先将元素映射过去,然后判断左边和右边元素是否在map中,并且和以前的元素是否连续,这样进行之后,将访问过的元素标记为0.z这种方法是可以达到O(n)的。所以,以后想不出来的时候,试着去用一下容器。
class Solution {
public:
map<int,int> mp;
int longestConsecutive(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int i,j;
for(i=0;i<num.size();i++)
mp[num[i]]=1;
int res=0;
for(i=0;i<num.size();i++){
int sum=1;
if(mp.count(num[i])){
mp[num[i]]=0;
int left=num[i]-1;
while(mp.count(left)&&mp[left]!=0){
mp[left--]=0;
sum++;
}
int right=num[i]+1;
while(mp.count(right)&&mp[right]!=0){
mp[right++]=0;
sum++;
}
}
if(res<sum)
res=sum;
}
return res;
}
};
更多推荐
已为社区贡献1条内容
所有评论(0)