zoukankan      html  css  js  c++  java
  • leetcode 128. 最长连续子序列

    题目描述:

    给定一个未排序的整数数组,找出最长连续序列的长度。

    要求算法的时间复杂度为 O(n)

    示例:

    输入:[100, 4, 200, 1, 3, 2]

    输出:4

    即最长的连续序列为 [1,2,3,4]

    思路分析:

    由于要求O(n)的复杂读,因此直接排序是不可行的。

    这里用到的是并查集的思想。对于每一个数,去查小于1和大于1的数是否在序列中。通过迭代求解。

    尽管在 for 循环中嵌套了一个 while 循环,时间复杂度看起来像是二次方级别的。但其实它是线性的算法。因为只有当 currentNum 遇到了一个序列的开始, while 循环才会被执行(也就是 currentNum-1 不在数组 nums 里), while 循环在整个运行过程中只会被迭代 n 次。这意味着尽管看起来时间复杂度为 O(n⋅n) ,实际这个嵌套循环只会运行 O(n + n) =O(n) 次。所有的计算都是线性时间的,所以总的时间复杂度是 O(n)的。

    代码:

     1 class Solution {
     2 public:
     3     int longestConsecutive(vector<int>& nums) {
     4         if(nums.size()==0)
     5             return 0;
     6         int ans = 0;
     7         unordered_set<int> myset(nums.begin(), nums.end());
     8         for(int i = 0; i<nums.size(); i++)
     9         {
    10             if(myset.count(nums[i]-1)==0)
    11             {
    12                 int x = nums[i]+1;
    13                 while(myset.count(x))
    14                 {
    15                     x++;
    16                 }
    17                 ans = max(ans, x-nums[i]);
    18             }
    19             
    20         }
    21         return ans;
    22     }
    23 };
  • 相关阅读:
    Java中替换字符串中特定字符,replaceAll,replace,replaceFirst的区别
    牛客剑指offer 67题(持续更新~)
    从尾到头打印链表
    字符串变形
    缩写
    删除公共字符
    替换空格
    二维数组的查找
    acm博弈论基础总结
    acm模板总结
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11397191.html
Copyright © 2011-2022 走看看