LeetCode-128 最长连续序列
最长连续序列
题目描述
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
数据样例
示例 1:
1 | 输入:nums = [100,4,200,1,3,2] |
示例 2:
1 | 输入:nums = [0,3,7,2,5,8,4,6,0,1] |
提示:
- $0 \leq nums.length \leq 10 ^ 5$
- $-10 ^ 9 \leq nums[i] \leq 10 ^ 9$
哈希表 - $O(N)$
哈希表
对于给定数组中的每一个数 $x$,我们依次来看:$x + 1, x + 2, …$ 是否存在。
假设我们找到最大的 $y$ 使得 $x, x + 1, …, x + y$ 都在数组中。那么 以 $x$ 开头的连续的元素最多就有 $y$ 个
因此:可以 依次枚举数组中的元素 作为 $x$,依次枚举 $x + 1, x + 2, …$ 找到最大的 $y$ 即可
- 每次判断一个数是否在数组中,如果直接枚举,那么每次寻找 $y$ 需要 $O(N)$ 遍历一遍数组
因此可以使用 哈希表 来判断元素是否存在于数组中,哈希表每次查询时间复杂度为 $O(1)$
优化:
- 如果某个数之前已经被枚举过了,也就是如果其已经和前面某个数构成连续序列了,则跳过。
- 可以直接枚举哈希表,因为哈希表中会将元素去重,重复元素可以跳过
时间复杂度 - $O(N)$
- 每个元素最多被遍历过两次,一次是枚举到当前元素,另外一次是可能组成连续序列
- 枚举数组中的所有元素 $O(N)$,每次查询哈希表复杂度为 $O(1)$,因此整体时间复杂度为 $O(N)$
代码
1 | func longestConsecutive(nums []int) int { |
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Cat's Blog!
评论