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

📅 刷题 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梦冷笑:

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

相关推荐
爱编程的鱼1 小时前
计算机(电脑)是什么?零基础硬件软件详解
java·开发语言·算法·c#·电脑·集合
洛生&1 小时前
【abc417】E - A Path in A Dictionary
算法
亮亮爱刷题1 小时前
算法提升之数学(快速幂+逆元求法)
算法
恣艺1 小时前
LeetCode 124:二叉树中的最大路径和
算法·leetcode·职场和发展
weisian1512 小时前
力扣经典算法篇-42-矩阵置零(辅助数组标记法,使用两个标记变量)
算法·leetcode·矩阵
恣艺2 小时前
LeetCode 123:买卖股票的最佳时机 III
算法·leetcode·职场和发展
geoyster2 小时前
20250802-102508010-CP
算法
Q741_1472 小时前
优选算法 力扣 202.快乐数 快慢双指针 解决带环问题 C++解题思路 每日一题
c++·算法·leetcode·快慢双指针·环形问题
DONG9132 小时前
Python 中的可迭代、迭代器与生成器——从协议到实现再到最佳实践
开发语言·汇编·数据结构·python·算法·青少年编程·排序算法
GeekPMAlex3 小时前
RAG 02 多模态检索 多维主键
算法