zoukankan      html  css  js  c++  java
  • Leetcode::Longest Consecutive Sequence

    Description:

    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.

    分析:这道题目利用hashmap, 完全没想到。。。。! hashmap可以做到快速查找O(1),当用到大量查找的时候,hashmap不能忘记!

    为什么这道题目会用到大量查找呢,因为无序数组还想找连续序列,还要保证O(n)复杂度,即只能遍历数组。则做法就是对一个数,搜索

    跟它相邻的那些数,一直搜索到连续链断掉!

    这题建立了一个hashmap的键是数组值,那值设为什么呢? 没有值,就可以只用一个unordered_set搞定,但是一个搜索到一个连续链

    很多值就已经被用到了,所以为了避免重复,hashmap的值就设为bool,来表示这个值是否被用到。 

     1 class Solution {
     2 public:
     3     int longestConsecutive(vector<int> &num) {
     4         //build a hashmap to store used-situation
     5         //Expand each element to find its longest subsequence
     6         unordered_map<int,bool> usedrec;
     7         
     8         vector<int>::iterator iter;
     9         for(iter=num.begin();iter!=num.end();iter++)
    10             usedrec[*iter] = false;
    11         
    12         //iter = num.begin();
    13         int maxcons = 0;
    14         
    15         for(iter = num.begin();iter!=num.end();iter++)
    16         {
    17             if(usedrec[*iter]) continue;
    18             int length = 1;
    19             
    20             //left expand
    21             for(int tar = *iter-1;usedrec.find(tar)!=usedrec.end();tar--)
    22             {
    23                 length++;
    24                 usedrec[tar] = true;
    25             }
    26             //right expand
    27             for(int tar = *iter+1;usedrec.find(tar)!=usedrec.end();tar++)
    28             {
    29                 length++;
    30                 usedrec[tar] = true;
    31             }
    32             
    33             maxcons = max(maxcons, length);
    34         }
    35         return maxcons;
    36     }
    37 };

    这道题目当然还有一般的解法,O(nlogn).首先排序,然后找最大链

     1 class Solution {
     2 public:
     3     int longestConsecutive(vector<int> &num) {
     4         if(num.empty()) return 0;
     5         sort(num.begin(),num.end());
     6         int cons=1,maxcon=1;
     7         for(int i=1;i<num.size();i++)
     8         {
     9             if(num[i]==num[i-1]) continue;
    10             if((num[i]-num[i-1])==1) cons++;
    11             else{
    12                 if(cons > maxcon) maxcon = cons;
    13                 cons = 1;
    14             }
    15         }
    16         maxcon = max(cons,maxcon);
    17         
    18         return maxcon;
    19     }
    20 };
  • 相关阅读:
    职业生涯步步高:一位资深经理人的职业生涯感悟
    HDU2082解题报告
    How the brain recognizes objects
    学习"图"(最短路径)算法
    HDOJ1022解题报告
    【转】受用的十条经验哈
    Archive for the 'TED' Category TED视频:Tan Le 能读懂脑电波的耳机
    WiFi 802.11ac驱动无线家庭高清影院
    asp.net后台编写 loading效果
    c#字符串分割
  • 原文地址:https://www.cnblogs.com/soyscut/p/3774456.html
Copyright © 2011-2022 走看看