前言
提示:以下是本篇文章正文内容,编程语言为Java
一、题目描述
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
链接:最长连续序列
二、解题思路
最朴素的想法是:我们考虑枚举数组中的每个数 x
,考虑以其为起点,不断尝试匹配 x+1,x+2,⋯
是否存在,假设最长匹配到了 x+n
,那么以 x
为起点的最长连续序列即为 x,x+1,x+2,⋯,x+n
,其长度为 n+1
,我们不断枚举并更新答案即可。但这种方式显然不满足时间复杂度的要求。
仔细分析这个过程,我们会发现其中执行了很多不必要的枚举,如果已知有一个x,x+1,x+2,⋯,x+n
的连续序列,而我们却重新从 x+1
,x+2
或者是 x+n
处开始尝试匹配,那么得到的结果肯定不会优于枚举 x
为起点的答案,因此我们在外层循环的时候碰到这种情况跳过即可。
因此,我们可以用哈希表检查数组每一个元素 x
的 x-1
是否存在,若存在直接跳过即可。若不存在,我们才去循环查找以 x
为起点的最长连续序列。
三、示例代码
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> set=new HashSet<>();
for(int num:nums){
set.add(num);
}
int ans=0;
for(int num:set){
int tmp=1;
if(!set.contains(num-1)){
while(set.contains(++num)){
++tmp;
}
}
ans=Math.max(ans,tmp);
}
return ans;
}
}
总结
当面对题目毫无思路时,我们可以采用最暴力的 枚举法 解决这个问题,然后,我们通过分析枚举的过程,来对枚举过程进行优化,去除一些重复或无用的枚举,也许就能成功解决难题。