给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
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++;
}
}
// [num, cur]之间是连续的,数字有cur - num + 1个
ans = Math.max(ans, cur - num + 1);
}
return ans;
}
}
注意:上述代码虽然有两层循环for+while,但是由于if (!set.contains(cur - 1))判断的存在,每个元素只会被遍历一次,因此时间复杂度也为O(n)。