码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode: Longest Consecutive Sequence [128]

时间:2014-06-25 07:55:42      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:leetcode   算法   面试   

【题目】

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

For example,
Given [100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

Your algorithm should run in O(n) complexity.


【题意】

    给定一个未排序的整数数组,找长度最长的连续整数串序列,并返回长度。 复杂度要求O(n)


【思路】

    O(n)不一定是one pass, 脑子里总是有这么种固定思维,自己给自己挖了个坑。O(kn)也是O(n), 只要k是常数。
    要找连续串,又不能排序,那我们要构造一个类列表结构把连续的数串起来。那么怎么串呢?很显然,给定一个数N,那我们需要知道他的前一个数prev和它的后一个数next是否存在,如果存在我们就可以串到prev或者next, 如果不存在则连续串就结束鸟。我们用一个map来表示这种前后继关系。
    prev=N-1; next=N+1; 假定N是存在于数组中的,则map[N]=1
    如果prev也在数组中,则map[prev]=1, 否则map[prev]=0
    如果next也在数组中,则map[next]=1, 否则map[next]=0
    
    我们对数组进行两遍扫描:
    第一遍扫描是我们生成前后关系map
    第二遍扫描利用前后关系恢复连续串,恢复过程中对应数的map[i]都置为0,避免重复恢复

    


【代码】

class Solution {
public:
    int longestConsecutive(vector<int> &num) {
        int size=num.size();
        if(size==0)return 0;
        
        //第一遍扫描建立前后关系map
        map<int, int> exist;
        for(int i=0; i<size; i++){
            exist[num[i]]=1;
            if(exist[num[i]-1]!=1)exist[num[i]-1]=0;
            if(exist[num[i]+1]!=1)exist[num[i]+1]=0;
        }
        
        //第二遍扫描
        int maxLength=0;
        for(int i=0; i<size; i++){
            if(exist[num[i]]==1){
                //恢复串
                int length=1;
                int number=num[i]-1;
                while(exist[number]==1){length++; exist[number]=0; number--;}
                number=num[i]+1;
                while(exist[number]==1){length++; exist[number]=0; number++;}
                if(length>maxLength)maxLength=length;
            }
        }
        return maxLength;
    }
};


LeetCode: Longest Consecutive Sequence [128],布布扣,bubuko.com

LeetCode: Longest Consecutive Sequence [128]

标签:leetcode   算法   面试   

原文地址:http://blog.csdn.net/harryhuang1990/article/details/34126555

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!