给定一个未排序的整数数组 nums,找出数字连续的最长序列的长度。
要求算法的时间复杂度为 O(n)。
输入:nums = [100, 4, 200, 1, 3, 2]
输出:4
解释:最长连续序列是 [1, 2, 3, 4],长度为 4。
- 连续指的是数值连续,不是数组下标连续。
- 不要求原数组有序。
- 元素可能重复,重复元素只算一次。
- 必须 O(n) ,不能先排序(排序是 O(n log n))。
思路
- 把所有数字放进一个
HashSet,去重。 - 遍历每个数
x:
- 如果
x-1不在 set 中,说明x是一个连续序列的起点。 - x
开始,依次看x+1,x+2`, ... 在不在 set 中,统计长度。
- 记录最大长度。
var longestConsecutive = function(nums) {
const set = new Set(nums);
let max = 0;
for (let x of set) {
if (!set.has(x - 1)) { // 只从序列起点开始
let len = 1;
while (set.has(x + len)) len++;
max = Math.max(max, len);
}
}
return max;
};