首页 > 其他 > 详细

leetcode第一刷_Longest Consecutive Sequence

时间:2014-05-07 07:50:14      阅读:420      评论:0      收藏:0      [点我收藏+]

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



leetcode第一刷_Longest Consecutive Sequence,布布扣,bubuko.com

leetcode第一刷_Longest Consecutive Sequence

原文:http://blog.csdn.net/u012792219/article/details/25077155

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!