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

leetcode第一刷_Longest Consecutive Sequence

2014-05-05 21:20 337 查看
给你一个数组,O(N)时间找出某些个数,这些题如果没见过,还真不是很好想。做了这些题,我觉得有下面两个个比较常见的思路:

1. 用两个指针,可以从一边开始,走某个距离停止,也可能是一头一尾两个指针,定义一种大小关系,他俩比较之后移动,直到相遇。

2. 用其他的辅助的数据结构,可能是hash表,可能是map,可能是栈或者队列。这种通常用在访问了现在的不能确定他们是不是有用,是不是能影响最后的结果,如果不先存下来,复杂度很可能就是N^2的了。

思路抽象了些,第二刷的时候我想能不能具体归类一下。

这道题用到了第二种,用辅助的空间。数组没排序,也没告诉数据范围,什么双指针肯定搞不定了,连续的数字可能离很远,用自动排序好的map方便一些。map的值正好可以用来标记是否访问过。关于什么时候用什么样的辅助结构,应该也有比较系统的经验,我道行还不够深,不能很好的总结,先欠着。

实现的时候,从头开始扫map,如果没访问过,就从左和右两侧查看,有个问题,如果用下标方法访问map,那个键不存在的话,会自动插入一个,对这个问题是没有影响的,因为自动插入的int为0,而且扫的顺序是按照原来数组中的顺序,因此map的规模变化了也没关系,其他的问题要注意这个影响。

class Solution {
public:
int longestConsecutive(vector<int> &num) {
int len = num.size();
if(len<=1)
return len;
int res = 1;
map<int, int> seq;
for(int i=0;i<len;i++){
seq[num[i]] = 1;
}
for(int i=0;i<len;i++){
if(!seq[num[i]])
continue;
int tpres = 1;
seq[num[i]] = 0;
int left = num[i]-1;
int right = num[i]+1;
while(seq[left]){
seq[left--] = 0;
tpres++;
}
while(seq[right]){
seq[right++] = 0;
tpres++;
}
if(tpres>res)
res = tpres;
}
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: