题目描述
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
解题思路
题目要求算法的时间复杂度为 O(n),因此需要使用一些巧妙的数据结构进行处理。本题使用哈希表(Map)来存储每个连续序列的边界值,并记录当前序列的长度。
具体实现如下:
- 对于每个数,如果其在哈希表中不存在,则以该数为左右边界的连续序列长度均为 1。
- 若该数已在哈希表中存在,则跳过不做处理。
- 对于每个数,遍历该数左右相邻的数(即 num - 1 和 num + 1),如果其在哈希表中存在,则将当前序列合并到相邻序列中,并更新该序列的长度。
最后,遍历所有序列的长度,返回其中最大值即可。
代码实现
function longestConsecutive(nums: number[]): number {
let map = new Map<number, number>();
let maxLen = 0;
for (let num of nums) {
if (map.has(num)) {
continue;
}
// 查找 num 前后是否存在连续数字
let left = map.get(num - 1) || 0;
let right = map.get(num + 1) || 0;
// 将 num 合并到相邻序列中,并更新边界长度
let len = left + right + 1;
map.set(num, len);
map.set(num - left, len);
map.set(num + right, len);
// console.log(num, left, right, len, map)
// 更新最大长度
maxLen = Math.max(maxLen, len);
}
return maxLen;
}
不理解的话看下过程:
复杂度分析
时间复杂度:O(n)
- 遍历整个数组,时间复杂度为 O(n)。
- 在哈希表中查找元素的时间复杂度为 O(1)。
空间复杂度:O(n)
- 哈希表最坏情况下需要存储 n 个元素。