首页 > 代码库 > leetcode第一刷_Longest Consecutive Sequence

leetcode第一刷_Longest Consecutive Sequence

给你一个数组,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;
    }
};