创见博客
最长连续序列
七崽爱吃小饼干2026/01/05阅读 0专栏 算法合集

最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

codeType
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

codeType
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

示例 3:

codeType
输入:nums = [1,0,1,2]
输出:3

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109

解法:

用哈希表记录每个访问过的数字,进行跳过。同时查找序列只需要循环查找比当前数字小1和大1的数字即可。

ts
function longestConsecutive(nums: number[]): number {
    // 把所有的数字都存入哈希表 { [number]: boolean } 
    // 从第一个数字开始遍历哈希表,被访问过的数字置true
    // 查找该数字是否存在 num - 1 以及 num + 1
    const n = nums.length
    const map = new Map<number, boolean>()
    for(let i = 0; i < n; i++){
        map.set(nums[i], false) // 初始化,未被访问过的数字置false
    }
    let maxLen = 0
    for(let i = 0; i < n; i++){ // 这里可以改成遍历哈希表的key,因为会有重复数字
        let curNum = nums[i]
        let bigNum = curNum + 1
        let smallNum = curNum - 1
        let len = 1
        if(map.get(curNum)) continue // 当前数字被访问过,直接跳过
        // 当前数字置true
        map.set(curNum, true)
        while(map.has(bigNum)){ // 比该数字大1
            map.set(bigNum, true)
            len++
            bigNum++
        }
        while(map.has(smallNum)){ // 比该数字小1
            map.set(smallNum, true)
            len++
            smallNum--
        }
        maxLen = Math.max(maxLen, len)
    }
    return maxLen
};
评论
0/100