leetcode 128. 最长连续子序列

Posted lj-lj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ;

 

以上是关于leetcode 128. 最长连续子序列的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题 最长递增子序列

Leetcode刷题Python674. 最长连续递增序列

leetcode 128:最长连续序列

图解leetcode —— 128. 最长连续序列

LeetCode 128. 最长连续序列

LeetCode128. 最长连续序列