• [LeetCode] 128. 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) ,使用排序会超时。

    思索未果,再网上找到一个方案,借助 unordered_set 来实现。

    将元素全部塞进 unordered_set 中。

    取出 unordered_set 中的一个剩余元素 x ,找到 unordered_set 中 x 的全部前后相邻元素,并将 x 和相邻元素全部移除,此时能得到 x 的相邻长度。若 unordered_set 还有元素,则继续当前步骤。

    在第二步中的所有相邻长度中,找出最大值便是原问题的解。

    由于 unordered_set 是基于 hash_table 来实现的,所以每次插入、查找、删除都是 O(1),而全部元素只会 插入、查找、删除 1 次,所以整体复杂度是 O(n)。

     1     int longestConsecutive(vector<int>& nums) {
     2     
     3         unordered_set<int> theSet;
     4         for (int i = 0 ; i < nums.size(); i++) {
     5             theSet.insert(nums[i]);
     6         }
     7         
     8         int longest = 0;
     9         while (theSet.size() > 0 ) {
    10                         
    11             int tmp = *theSet.begin();
    12             theSet.erase(tmp);
    13             
    14             int cnt = 1;
    15             
    16             int tmpR = tmp + 1;
    17             while (theSet.count(tmpR)) {
    18                 cnt++;
    19                 theSet.erase(tmpR);
    20                 tmpR++;
    21             }
    22             
    23             int tmpL = tmp - 1;
    24             while (theSet.count(tmpL)) {
    25                 cnt++;
    26                 theSet.erase(tmpL);
    27                 tmpL--;
    28             }
    29     
    30             longest = max( longest, cnt);
    31             
    32         }
    33         
    34         return longest;
    35     }

    参考资料:

    [LeetCode] Longest Consecutive Sequence, 喜刷刷

  • 相关阅读:
    文件
    drf序列化组件
    drf入门规范
    单例模式
    初识drf
    restful规范
    虚拟环境使用
    vue基础(三)
    vue基础(二)
    作业
  • 原文地址:https://www.cnblogs.com/TonyYPZhang/p/5081334.html
Copyright © 2020-2023  润新知