您的位置:首页 > 产品设计 > UI/UE

128. Longest Consecutive Sequence

2016-05-07 15:22 411 查看
题目要求找到所有连续的数字的个数 本来想先排序 然后看前面的一个数字是不是等于当前数字-1 然后进行计数 但是排好序后复杂度就是nlogn了

所以想了另外一种方法 扫描每个数a 然后寻找a-1 a-2 …. a+1 a+2….

把比a大的和比a小的相加 就得到了连续的个数 来更新maxlen

但是 有个问题 就是怎么确定a-1在不在数组中 这里使用hash表 这样寻找每个元素的时间就是o(1) 如果 原先数组是{4,3,2,1} 则 每个元素都寻找 和它相连的元素的话复杂度就是n*n了 所以为了避免重复的查找每找到一个相连的元素就把这个元素从hash表中删除

这里使用的是unordered_set unordered_set底层使用hash表来实现的

set 底层是使用红黑树实现的

using namespace std;
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int maxlen=0;
int assendinglen=0;
int descendinglen=0;
for(int i=0;i<nums.size();i++)
{
flags.insert(nums[i]);
}
for(int i=0;i<nums.size();i++)
{
assendinglen=findNext(nums[i],assending);
descendinglen=findNext(nums[i]-1,descending);
if(assendinglen+descendinglen>maxlen)
maxlen=assendinglen+descendinglen;
}
return maxlen;
}
private:
enum order{
assending,
descending,
};
int findNext(int num,order o)
{
int number=0;
while(flags.find(num)!=flags.end())
{
number++;
flags.erase(num);
if(o==assending)
num++;
else
num--;

}
return number;
}
unordered_set<int> flags;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: