• 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.

    分析:

    算法1:首先想到的是排序,排序后遍历一遍就可以找出最长连续序列的长度,只是要稍微注意下判断连续序列的过程中有可能两个元素相同,比如1 2 2 3,排序复杂度n*log(n),虽然题目要求O(n)复杂度,但是这个解法也可以通过OJ,代码如下:

     1 class Solution {
     2 public:
     3     int longestConsecutive(vector<int> &num) {
     4         // IMPORTANT: Please reset any member data you declared, as
     5         // the same Solution instance will be reused for each test case.
     6         int res = 1, len = num.size();
     7         if(len == 0)return 0;
     8         sort(num.begin(), num.end());
     9         int curr = 1;
    10         for(int i = 1; i < len; i++)
    11         {
    12             if(num[i] - num[i-1] == 1)
    13             {
    14                 curr++;
    15                 if(curr > res)res = curr;
    16             }
    17             else if(num[i] - num[i-1] == 0);
    18             else 
    19                 curr = 1;
    20         }
    21         return res;
    22     }
    23 };
    View Code

    算法2:想要O(n)的算法,我们只有以时间换空间,先把数组中所有元素映射到哈希表。然后以题目给出的数组为例:对于100,先向下查找99没找到,然后向上查找101也没找到,那么连续长度是1,从哈希表中删除100;然后是4,向下查找找到3,2,1,向上没有找到5,那么连续长度是4,从哈希表中删除4,3,2,1。这样对哈希表中已存在的某个元素向上和向下查找,直到哈希表为空。算法相当于遍历了一遍数组,然后再遍历了一遍哈希表,复杂的为O(n)。代码如下:                            本文地址

     1 class Solution {
     2 public:
     3     int longestConsecutive(vector<int> &num) {
     4         // IMPORTANT: Please reset any member data you declared, as
     5         // the same Solution instance will be reused for each test case.
     6         int res = 1, len = num.size();
     7         if(len == 0)return 0;
     8         unordered_set<int> hashtable;
     9         for(int i = 0; i < len; i++)
    10             hashtable.insert(num[i]);
    11         while(hashtable.empty() == false)
    12         {
    13             int currlen = 1;
    14             int curr = *(hashtable.begin());
    15             hashtable.erase(curr);
    16             int tmp = curr-1;
    17             while(hashtable.empty()==false && 
    18                 hashtable.find(tmp) != hashtable.end())
    19             {
    20                 hashtable.erase(tmp);
    21                 currlen++;
    22                 tmp--;
    23             }
    24             tmp = curr+1;
    25             while(hashtable.empty()==false && 
    26                 hashtable.find(tmp) != hashtable.end())
    27             {
    28                 hashtable.erase(tmp);
    29                 currlen++;
    30                 tmp++;
    31             }
    32             if(res < currlen)res = currlen;
    33         }
    34         return res;
    35     }
    36 };

    【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3422249.html

  • 相关阅读:
    2020/11/4
    2020/11/10
    2020/11/12
    2020/11/5
    20201113 千锤百炼软工人
    20201112 千锤百炼软工人
    Java_swing_打开文件目录
    千锤百炼软工周报二
    9.29 课下动手动脑
    开学小测感想
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3422249.html
Copyright © 2020-2023  润新知