题目描述
给定一个未排序的整数数组 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)的解法来求解,我们只能通过遍历一遍,也就是一层循环来求解,那该怎么解决呢?
- 题目突破口,遍历给定的数组集合,判断当前元素之后的元素是否存在(当前元素+1),如果存在,那么继续判断,如果不在,中断循环,我们需要累计最大连续序列的长度。
- 需要注意的是,上面这个过程还有需要优化的点,当前元素的值如果从num开始,那么之后判断元素就是num+1,num+2,num+3.。。。。这些元素是否在集合中。那么,如果我们之前的元素,比如num-1的元素已经判断过的话,那么此时就不用再从num开始判断了,因为num-1到最后结束的位置一定是大于从num开始到最后结束的位置的,所以此时num-1就是最优的位置。这个也就是我们判断的一个点。
实现代码
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 cur = num;
// 当num-1不存在时,开始向后遍历num+1,num+2,num+3。。。
if (!set.contains(cur - 1)) {
while (set.contains(cur + 1)) {
cur++;
}
}
// 求得最终的结果:cur - num + 1个
ans = Math.max(ans, cur - num + 1);
}
return ans;
}
}