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 };
  • 相关阅读:
    web框架基础
    前端基础之DOM和jQuery
    前端基础之JavaScript
    前端基础之CSS
    福州大学W班-助教总结
    福州大学W班-个人最终成绩统计
    福州大学W班-Beta冲刺评分
    福州大学W班-alpha冲刺评分
    福州大学W班-团队作业-随堂小测(同学录)成绩
    福州大学W班-需求分析评分排名
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11397191.html
Copyright © 2011-2022 走看看