zoukankan      html  css  js  c++  java
  • [LeetCode] Longest Consecutive Sequence

    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*logn)的算法.

    方法二

    只是找连续的嘛,我们可以把所有的数字都存入hash表,然后随意从某个数字开始找他的前面和后面那个是否存在.

    然后得到一个最大的长度.当然找过的就可以删掉了...你想,一个连续的序列,你从中间任意位置开始往两边找不都一样么.

    所以只要找过就可以删掉了.

     1 class Solution {
     2 public:
     3     set<int> flag;
     4     int findBound(int n , bool asc){
     5         int ans = 0;
     6         set<int>::iterator iter;
     7         while((iter = flag.find(n)) != flag.end()){
     8             flag.erase(iter);
     9             ans ++;
    10             if(asc) 
    11                 n-- ;
    12             else 
    13                 n++;
    14         }
    15         return ans;
    16     }
    17     int longestConsecutive(vector<int> &num) {
    18         // Start typing your C/C++ solution below
    19         // DO NOT write int main() function
    20              
    21         int ans = 0;
    22         flag.clear();
    23         for(int i = 0 ; i < num.size() ; i++)
    24            flag.insert(num[i]);
    25         for(int i = 0 ; i < num.size(); i++){
    26             ans = max(findBound(num[i],true) + findBound(num[i]+1,false) , ans); 
    27         }
    28         return ans;
    29     }
    30 };

    下面用hash代替了set,思想一样,看上去没有上面的简洁

     1 class Solution {
     2 public:
     3     int longestConsecutive(vector<int> &num) {
     4         // Start typing your C/C++ solution below
     5         // DO NOT write int main() function
     6         map<int, int> hmap;
     7         hmap.clear();
     8         int n = num.size();
     9         for(int i=0; i<n; i++){
    10             hmap.insert(pair<int, int>(num[i], i));
    11         }
    12         int ans=0, cnt=0;
    13         map<int, int>::iterator it;
    14         for(int i=0; i<num.size(); i++){
    15             int cur = num[i];
    16             it = hmap.find(num[i]);
    17             cnt = 1;
    18             if(it!=hmap.end()){
    19                 map<int, int>::iterator iter;
    20                 while(1){
    21                     iter = hmap.find(++cur);
    22                     if(iter==hmap.end())
    23                         break;
    24                     cnt++;    
    25                     hmap.erase(iter);
    26                 }
    27                 cur=num[i];
    28                 while(1){
    29                     iter = hmap.find(--cur);
    30                     if(iter==hmap.end())
    31                         break;
    32                     cnt++;    
    33                     hmap.erase(iter);
    34                 }
    35                 if(ans<cnt)
    36                     ans = cnt;           
    37                 
    38             }
    39             
    40         }
    41         return ans;
    42     }
    43 };
  • 相关阅读:
    链表--判断一个链表是否为回文结构
    矩阵--“之”字形打印矩阵
    二叉树——平衡二叉树,二叉搜索树,完全二叉树
    链表--反转单向和双向链表
    codeforces 490C. Hacking Cypher 解题报告
    codeforces 490B.Queue 解题报告
    BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
    codeforces 488A. Giga Tower 解题报告
    codeforces 489C.Given Length and Sum of Digits... 解题报告
    codeforces 489B. BerSU Ball 解题报告
  • 原文地址:https://www.cnblogs.com/diegodu/p/3791119.html
Copyright © 2011-2022 走看看