码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 128. 最长连续子序列

时间:2019-08-23 00:02:38      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:mys   时间复杂度   就是   大于   order   嵌套   因此   描述   for   

题目描述:

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

要求算法的时间复杂度为 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 };

 

leetcode 128. 最长连续子序列

标签:mys   时间复杂度   就是   大于   order   嵌套   因此   描述   for   

原文地址:https://www.cnblogs.com/LJ-LJ/p/11397191.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!