LeetCode 0128.最长连续序列
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0128.最长连续序列相关的知识,希望对你有一定的参考价值。
【LetMeFly】128.最长连续序列
力扣题目链接:https://leetcode.cn/problems/longest-consecutive-sequence/
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
方法一:排序(非O(n))
方法一比较简单,但是时间复杂度非题目要求的 O ( n ) O(n) O(n)
首先对原数组进行排序,排序过后从前向后遍历一遍数组,遇到与上一个相同的就跳过,遇到比上一个大 1 1 1的就累计,否则就重新开始统计并更新答案。
- 时间复杂度 O ( n log n ) O(n\\log n) O(nlogn),其中 n n n是原始数组的大小
- 空间复杂度 O ( log n ) O(\\log n) O(logn)
AC代码
C++
class Solution
public:
int longestConsecutive(vector<int>& nums)
sort(nums.begin(), nums.end());
int ans = 0;
int lastNum = -INT_MAX;
int nowCnt = 0;
for (int i = 0; i < nums.size(); i++)
if (nums[i] == lastNum)
continue;
if (nums[i] == lastNum + 1)
nowCnt++;
else
nowCnt = 1;
lastNum = nums[i];
ans = max(ans, nowCnt);
return ans;
;
方法二:哈希(O(n))
方法一中的时间复杂度主要来自排序。
排序的目的是什么?
排序的目的是:遇到a的时候看是否存在a + 1。
那么,用哈希表记录一下不是一样的效果吗?
初始时,用哈希表统计原始数据并去重
之后遍历去重后的数字,遍历到 a a a时,如果 a − 1 a-1 a−1存在( s e . c o u n t ( a − 1 ) se.count(a-1) se.count(a−1)),那么就继续遍历
如果 a − 1 a-1 a−1不存在,那么久说明 a a a是某个“连续串”的开始(原始数组中存在 a , a + 1 , a + ⋯ a, a+1, a+\\cdots a,a+1,a+⋯)
这时候,从 a a a开始,每次 a a a递增 1 1 1,看是否存在新的 a a a,以此来统计从 a a a开始的“连续串”的长度
- 时间复杂度 O ( n ) O(n) O(n),其中 n n n是原始数组的大小。因此是从最小的 a a a开始统计的,所以所有数字最多额外遍历一遍。
- 空间复杂度 O ( n ) O(n) O(n)
AC代码
C++
class Solution
public:
int longestConsecutive(vector<int>& nums)
unordered_set<int> se;
int ans = 0;
for (int& t : nums)
se.insert(t);
for (int t : se)
if (!se.count(t - 1)) // 一串数字的最小的
int thisCnt = 0;
while (se.count(t))
thisCnt++;
t++;
ans = max(ans, thisCnt);
return ans;
;
对比
因为方法一的空间复杂度较低,并且方法一只需要排序,时间复杂度不一定达到 O ( n log n ) O(n\\log n) O(nlogn)
方法二空间复杂度较高,虽然时间复杂度是 O ( n ) O(n) O(n),但是哈希表时间复杂度常数较大,时间不一定比方法一短。
经过不严谨对比(每种方法都只试了一次):
- 方法一执行用时52ms,空间消耗32.9MB
- 方法二执行用时100ms,空间消耗48.6MB
数据可能存在很大的偶然性误差,但是上述提交方法一的表现要比方法二优秀
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125922929
以上是关于LeetCode 0128.最长连续序列的主要内容,如果未能解决你的问题,请参考以下文章