LeetCode经典题解:128、最长连续序列

“最长连续序列”是一道极具代表性的数组处理问题, 本文将带你从直观思路出发,逐步推导出最优解法,并通过场景化记忆技巧掌握核心逻辑。

一、题目描述

题目:给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
要求:时间复杂度为 O(n)。

示例
输入:nums = [100, 4, 200, 1, 3, 2]
输出:4
解释:最长连续序列是 [1, 2, 3, 4],长度为 4

二、解法分析:从暴力到最优

方法一:暴力法(直观但超时)

思路

对每个数 x,检查 x+1, x+2, ... 是否存在于数组中,记录最长连续序列的长度。

代码
public int longestConsecutive(int[] nums) {int longestStreak = 0;for (int num : nums) {int currentNum = num;int currentStreak = 1;while (arrayContains(nums, currentNum + 1)) {currentNum += 1;currentStreak += 1;}longestStreak = Math.max(longestStreak, currentStreak);}return longestStreak;
}private boolean arrayContains(int[] arr, int num) {for (int i = 0; i < arr.length; i++) {if (arr[i] == num) {return true;}}return false;
}
复杂度
  • 时间复杂度:O(n³)
    • 遍历数组 O(n)
    • 对每个数检查后续 O(n)
    • 每次检查是否存在 O(n)
  • 空间复杂度:O(1)

方法二:排序法(O(n log n),不符合要求但易理解)

思路

先排序数组,再遍历统计连续序列长度。

代码
public int longestConsecutive(int[] nums) {if (nums.length == 0) return 0;Arrays.sort(nums);int longestStreak = 1;int currentStreak = 1;for (int i = 1; i < nums.length; i++) {if (nums[i] != nums[i-1]) {if (nums[i] == nums[i-1] + 1) {currentStreak++;} else {longestStreak = Math.max(longestStreak, currentStreak);currentStreak = 1;}}}return Math.max(longestStreak, currentStreak);
}
复杂度
  • 时间复杂度:O(n log n)(排序主导)
  • 空间复杂度:O(1)(忽略排序的栈空间)

方法三:哈希表优化(O(n),最优解)

思路
  1. 用哈希表存储所有数:快速判断某个数是否存在(O(1))。
  2. 仅从序列起点开始计数:若 x-1 不存在,则 x 是序列起点,开始向后计数。
代码
public int longestConsecutive(int[] nums) {// 用 HashSet 存储所有数,支持 O(1) 查询Set<Integer> numSet = new HashSet<>();for (int num : nums) {numSet.add(num);}int longestStreak = 0;// 遍历每个数,若它是序列起点,则向后计数for (int num : numSet) {// 若 num-1 不存在,则 num 是序列起点if (!numSet.contains(num - 1)) {int currentNum = num;int currentStreak = 1;// 持续检查 currentNum+1 是否存在while (numSet.contains(currentNum + 1)) {currentNum += 1;currentStreak += 1;}longestStreak = Math.max(longestStreak, currentStreak);}}return longestStreak;
}
复杂度
  • 时间复杂度:O(n)
    • 每个数最多被访问两次(一次插入哈希表,一次计数)
  • 空间复杂度:O(n)(哈希表存储所有数)

三、最优解法的核心逻辑

1. 为什么用哈希表?

哈希表(HashSet)提供 O(1) 的查找效率,能快速判断某个数是否存在,避免了暴力法中的嵌套循环。

2. 如何避免重复计数?

关键在于只从序列的起点开始计数。例如,对于序列 [1, 2, 3, 4],我们只在遇到 1 时才开始向后计数,遇到 2, 3, 4 时直接跳过。
判断条件:若 num-1 不存在于哈希表中,则 num 是序列起点。

四、记忆技巧:把代码变成“寻宝游戏”

用场景化记忆法理解最优解法的核心逻辑:

1. 角色赋值

  • 哈希表(numSet):扮演“地图”,标记所有宝藏位置(数字存在)。
  • 遍历过程:扮演“探险家”,在地图上寻找宝藏。
  • 序列起点:扮演“特殊宝藏”,只有找到它才能开启连续挖掘。

2. 游戏规则

① 探险家拿到地图(哈希表),标记所有宝藏位置。
② 探险家随机站在一个数字位置上,检查:

  • 如果左边一格(num-1)没有宝藏,则当前位置是“特殊宝藏”,可开启连续挖掘;
  • 如果左边有宝藏,则跳过当前位置(留给左边的宝藏来挖掘)。
    ③ 挖到一个宝藏后,持续向右挖掘(检查 num+1),记录最长连续挖掘长度。

3. 关键记忆点

  • 只从序列起点开始挖掘 → 避免重复计数。
  • 哈希表快速定位宝藏 → O(1) 查询效率。

五、实战拓展:变种题巩固思路

  1. 允许重复元素:原题已自动处理(哈希表去重)。
  2. 返回具体序列:在计数时记录起点和终点,最后构造序列。
  3. 双向扩展:同时向前(num-1, num-2, ...)和向后扩展,适用于“允许不连续但可排序”的场景。

通过“寻宝游戏”的场景记忆,最优解法的逻辑会变得非常直观。记住:算法的本质是“用合适的数据结构优化操作”,本题中哈希表的作用不仅是存储数据,更是为了快速判断“起点”,从而避免重复计算。多思考这种“筛选起点”的思想,能帮助你解决更多类似问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88553.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电力分析仪的“双语对话”:CCLinkIE与Modbus TCP的无缝连接

在工业自动化领域&#xff0c;协议兼容性问题如同“方言壁垒”&#xff0c;让不同品牌、不同系统的设备难以高效协同。对于电力分析仪这类关键设备而言&#xff0c;如何打破CCLinkIE与Modbus TCP协议的“语言障碍”&#xff0c;已成为工程师优化系统集成的核心课题。 为何需要协…

暑假复习篇之文本编译器

一、知识点补充【在此次示例代码上显示的关键用法】知识点1、JMenuBar&#xff1a;菜单栏的容器&#xff0c;通常添加到JFrame的顶部。关键用法&#xff1a;add&#xff1a; 添加菜单到菜单栏2、JMenu&#xff1a;菜单条目&#xff08;“文件” “编辑” 等&#xff09;&#x…

Linux自动化构建工具(一)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录Li…

目标检测流程图绘制

目标检测流程图绘制作为一个长期科研的苦命人&#xff0c;我一般采用Processon。 一、目标检测流程图绘制的 “量身定制” 体验 Processon 的绘图元素库对目标检测领域极度友好&#xff0c;从基础模块到复杂结构都能精准匹配&#xff1a;   核心组件一键调用&#xff1a;在右…

GitHub 趋势日报 (2025年07月09日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图970genai-toolbox780WebAgent650rustfs451prompt-eng-interactive-tutorial246ai-a…

多云环境下的成本管理挑战与对策 ——资源碎片化治理与华为CloudMatrix破局之道

一、危机&#xff1a;多云成本失控已成企业“隐形杀手”成本超支概率激增据Gartner 2024报告&#xff0c;采用多云策略的企业成本超支概率比单云企业高47%&#xff0c;主因资源碎片化导致的闲置浪费和管控失效。触目惊心的数据&#xff1a;73%企业云成本占营收超20%&#xff0c…

Linux的基础I/O

目录 1、理解“文件” 1.1 狭义理解 1.2 广义理解 1.3 文件操作的归类认知 1.4 系统角度 2、回顾C文件接口 2.1 文件的打开与关闭 2.2 文件的读写函数 2.3 stdin & stdout & stderr 3、系统文件I/O 3.1 一种传标志位的方式 3.2 文件的系统调用接口 3.2.1 o…

广告匹配策略的智能化之路:人工智能大模型的方法和步骤

摘要 广告匹配策略是指根据用户的需求和偏好&#xff0c;向用户推荐最合适的广告的方法。广告匹配策略的优化是数字化营销的核心问题之一&#xff0c;也是提升广告效果和收益的关键因素。本文介绍了如何利用人工智能大模型&#xff0c;从数据分析、广告推荐、策略优化、效果评…

飞算JavaAI:重塑Java开发的“人机协同“新模式

引言 在Java开发领域&#xff0c;“效率"与"质量"的平衡始终是开发者面临的核心挑战——重复编码消耗精力、复杂业务易出漏洞、老系统重构举步维艰。飞算JavaAI的出现&#xff0c;并非简单地用AI替代人工&#xff0c;而是构建了一套"AI处理机械劳动&#…

运行ssh -T git@github.com报错

运行ssh -T gitgithub.com报错 no such identity: /root/.ssh/id_rsa: No such file or directory gitssh.github.com: Permission denied (publickey). 如果我用的是ed25519而非rsa&#xff0c;有id_ed25519 则需要打开~/.ssh/config检查一下是否写错了 vim ~/.ssh/config 然后…

20250710-2-Kubernetes 集群部署、配置和验证-网络组件存在的意义?_笔记

一、网络组件的作用&#xfeff;1. 部署网络组件的目的&#xfeff;核心功能&#xff1a;执行kubectl apply -f calico.yaml命令的主要目的是为Kubernetes集群部署网络组件必要性&#xff1a;解决Pod间的跨节点通信问题建立集群范围的网络平面&#xff0c;使所有Pod处于同一网络…

【牛客刷题】dd爱科学1.0

文章目录 一、题目介绍1.1 题目描述1.2 输入描述:1.3 输出描述:1.4 示例1二、解题思路2.1 核心策略2.2 算法流程2.3 正确性证明三、算法实现四、关键步骤解析五、复杂度分析六、正确性验证七、算法对比7.1 暴力搜索法7.2 动态规划7.3 三种解法对比分析一、题目介绍 1.1 题目描…

跑步-Java刷题 蓝桥云课

目录 题目链接 题目 解题思路 代码 题目链接 竞赛中心 - 蓝桥云课 题目 解题思路 用数组记录每个月有多少天,再使用一个int型变量记录是星期几,遍历即可 代码 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public stat…

Qt常用控件之QWidget(二)

Qt常用控件&#xff08;二&#xff09;1.window frame2.windowTitle3.windowIcon&#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Qt的学习】 &#x1f4dd;&#x1f4dd;本篇…

飞算Java AI:专为 Java 开发者打造的智能开发引擎

目录 一&#xff0c;核心功能 1&#xff0c;智能编码&#xff08;AI Coding&#xff09; 2&#xff0c;AI 驱动测试&#xff08;AI Testing&#xff09; 3&#xff0c;智能运维&#xff08;AIOps&#xff09; 4&#xff0c;工程化支持 二、注册与上手&#xff1a;3 分钟快…

基于开源AI大模型AI智能名片S2B2C商城小程序源码的私域流量新生态构建

摘要&#xff1a;私域流量并非新生概念&#xff0c;企业持续构建和经营“企业 - 客户”关系是其持续存在的关键&#xff0c;且会随时代发展自我完善迭代。本文探讨了开源AI大模型AI智能名片S2B2C商城小程序源码在私域流量领域的应用价值。通过分析私域流量发展现状与挑战&#…

用 ELK+Filebeat 提高50%问题排查效率,这套方案实测有效!

摘要 在中大型系统中&#xff0c;日志的分布常常让问题排查变得异常痛苦&#xff1a;每次出错都要登录一堆服务器、翻一堆文本&#xff0c;还不一定能找到关键线索。为了解决这个问题&#xff0c;ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;日志聚合平台应运而…

数据治理到底是什么?搞清这四件事,你就彻底明白了!

目录 第一件事&#xff1a;数据治理不是做“数据”&#xff0c;是做“管” 第二件事&#xff1a;治理的核心&#xff0c;是“数、责、权”的三角绑定 一是“数”&#xff1a;你到底有哪些数据&#xff1f; 二是“责”&#xff1a;每张表、每个字段是谁负责&#xff1f; 三…

Spring的事务控制——学习历程

思考&#xff1a;1. 事务是干什么的&#xff1f;2. 事务的特性&#xff1f;3. 事务控制的传播方式&#xff08;传播行为&#xff09;4. 事务的隔离级别5. 事务是如何实现的&#xff1f;6. 事务的回滚方式7. 事务失效场景回答&#xff1a;1. 事务和锁&#xff0c;还有版本控制 …

鸿蒙 Secure Boot 全流程解析:从 BootROM 到内核签名验证的实战指南

摘要 随着智能设备应用的深入&#xff0c;操作系统安全成为设备可信运行的基础。在物联网和多终端场景中&#xff0c;一旦系统被恶意篡改&#xff0c;将带来数据泄露、设备被控等严重后果。鸿蒙系统在安全启动方面设计了完整的机制&#xff0c;从最底层的 Boot ROM 开始逐级校验…