小哆啦解题记 · 连号危机与去重警告!

📅 刷题 Day 38

题号:128. 最长连续序列 - 力扣(LeetCode)

关键词:数组、哈希表、去重、O(n)、连续性判断


第一章:数列小镇的连号骚动

在一个叫 nums 的小镇上,居民们一直以来过着井然有序的生活------只要大家都能顺着住,比如 [1, 2, 3, 4] 连号排排坐,大家就其乐融融。

直到有一天,小镇来了几个重复户口的人,比如两个 "1" 和两个 "2",这下镇长大雄慌了:"哆啦A梦,我怎么知道他们到底谁在串门?最长连续住户到底有几个?"


第二章:去重风暴之谜

大雄赶紧抄起老本行------排序!

ini 复制代码
function longestConsecutive(nums: number[]): number {
    if (nums.length === 0) return 0;
    let numArr = Array.from(nums.sort((a, b) => a - b));
    let max = 1, count = 1, last = numArr[0];

    for (let i = 1; i < numArr.length; i++) {
        if (last + 1 === numArr[i]) {
            count++;
            max = Math.max(max, count);
        } else {
            count = 1;
        }
        last = numArr[i];
    }
    return max;
}

但很快,问题来了。

测试输入:

ini 复制代码
nums = [1, 0, 1, 2];

输出:

复制代码
2 ❌

"怎么才算出 2?明明有 0, 1, 2 啊!"


第三章:哆啦A梦出手 · 去重救场!

哆啦A梦一口铜锣烧没咽住:"你是不是忘了 ------ 有人重复登记户口了。"

原数组 [1, 0, 1, 2] 排序后是 [0, 1, 1, 2]

于是遍历时会跳过第二个 1,把连续性判成了"0,1" 和 "1,2" 两段不相连的序列

💥 重复项直接破坏了连续判断逻辑

于是大雄马上更新版本:

javascript 复制代码
let numArr = Array.from(new Set(nums.sort((a, b) => a - b)));

Set 一出手,重复一个不留!连续逻辑完美恢复 ✅


第四章:O(nlogn)警告来袭

"可是,这样排序之后虽然对了,复杂度也变成 O(nlogn) 了哎~"

大雄不安地搓搓手。

哆啦A梦摸出一本《算法复杂度法规》:

"题目明明写着要你用 O(n)!你这违章操作可不行!"


第五章:哈希流派的连号核爆

"别怕,我还有最后的秘密武器!"

哆啦A梦从四维口袋掏出一把"哈希能量枪":

ini 复制代码
function longestConsecutive(nums: number[]): number {
    const numSet = new Set(nums);
    let maxLen = 0;

    for (const num of numSet) {
        // 只有 num 是序列起点,才开始扩展
        if (!numSet.has(num - 1)) {
            let current = num;
            let count = 1;

            while (numSet.has(current + 1)) {
                current++;
                count++;
            }

            maxLen = Math.max(maxLen, count);
        }
    }

    return maxLen;
}

💡 起点判断 + 向后扫描 + 去重保障唯一性

------每个数字只访问一次,完美 O(n)!


第六章:为什么必须去重?

🎯 原因一 :重复元素在"连续性"中毫无意义,只会干扰判断

🎯 原因二 :重复元素可能导致判断 last + 1 === current 失败,从而断开原本是连续的序列

🎯 原因三:多次出现的数字若不去重,可能让连续计数"中断重启",错失最长结果

举个栗子:

ini 复制代码
nums = [1, 0, 1, 2]
不去重排序后 → [0, 1, 1, 2]

last = 0
current = 1 ✅

last = 1
current = 1 ❌ (跳过!导致 1→2 连接断了)

第七章:技术启示录

解法 是否正确 时间复杂度 是否符合要求
排序 + 遍历 O(nlogn)
排序 + 去重 O(nlogn)
Set + 起点扫描 O(n)

第八章:铜锣烧总结局

"所以我们不仅要排序,还得去重 ,然后还要换种逻辑思路 ,才能解出真正的'连续'。"

大雄一边总结,一边给哆啦A梦递上一盒热腾腾的铜锣烧。

哆啦A梦边吃边点头:"做题就像做铜锣烧,顺序对、配料准,才能香甜出炉。"

窗外传来胖虎的咆哮:

"谁把我家的 3 连号房抢成了 [1,2,3,4]?!我明明登记了两个 3 啊!"

哆啦A梦冷笑:

"重复登记,不算连续!"

相关推荐
zh_xuan21 分钟前
LeeCode92. 反转链表II
数据结构·算法·链表·leecode
2401_8414956443 分钟前
【数据结构】汉诺塔问题
java·数据结构·c++·python·算法·递归·
Q741_1471 小时前
C++ 位运算 高频面试考点 力扣137. 只出现一次的数字 II 题解 每日一题
c++·算法·leetcode·面试·位运算
天特肿瘤电场研究所1 小时前
专业的肿瘤电场疗法厂家
算法
DASXSDW2 小时前
NET性能优化-使用RecyclableBuffer取代RecyclableMemoryStream
java·算法·性能优化
kfepiza2 小时前
CAS (Compare and Swap) 笔记251007
java·算法
墨染点香2 小时前
LeetCode 刷题【103. 二叉树的锯齿形层序遍历、104. 二叉树的最大深度、105. 从前序与中序遍历序列构造二叉树】
算法·leetcode·职场和发展
啊我不会诶2 小时前
23ICPC澳门站补题
算法·深度优先·图论
Brookty3 小时前
【算法】二分查找(一)朴素二分
java·学习·算法·leetcode·二分查找
黑色的山岗在沉睡4 小时前
LeetCode 2761. 和等于目标值的质数对
算法·leetcode·职场和发展