news 2026/4/23 17:30:52

【LeetCode Hot100】128. 最长连续序列 - Java O(n) 解法详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【LeetCode Hot100】128. 最长连续序列 - Java O(n) 解法详解

📝 前言

今天在刷 LeetCode 热题 100 时,碰到了第 128 题“最长连续序列”。这是一道非常经典的题目,考察的重点是如何在不排序的情况下,利用哈希表在 O(n) 的时间复杂度内完成查找。

乍一看这道题如果用Arrays.sort()排序后遍历,时间复杂度是 O(nlog n),但这道题明确要求O(n),所以必须换一种思路。记录一下我的解题心得和最终代码。

📚 题目描述

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

示例 1:

输入: nums = [100,4,200,1,3,2]

输出: 4

解释: 最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

提示:

  • 请设计并实现时间复杂度为 O(n) 的算法。


💡 解题思路

1. 为什么不能排序?

题目硬性要求时间复杂度为 O(n)。我们知道标准的排序算法(如快排、归并)最快也是 O(nlog n),所以排序这条路走不通。我们需要一种能够快速查找的数据结构,哈希表 (HashSet)是最佳选择。

2. 核心逻辑:去重与定位“起点”

我们可以分两步走:

  1. 去重与存储:先把所有数字放入HashSet中,这样我们不仅去除了重复元素,还能在 O(1) 的时间内判断一个数是否存在。

  2. 寻找序列起点

    • 如果我们对集合中的每一个数x都去尝试向后枚举 (x+1,x+2...),时间复杂度最坏会达到 O(n^2)。

    • 关键优化点:我们只从序列的起点开始查找。

    • 如何判断起点?如果一个数x,它的前驱x-1在集合中,那么x一定是某个连续序列的第一个数。

    • 只有当x是起点时,我们才开始向后匹配x+1,x+2等等,统计长度。

3. 一个小优化

在统计过程中,如果当前找到的最长序列长度已经超过了哈希表中剩余元素的一半(或者总数的一半),其实就可以提前结束循环了,因为剩下的元素数量不可能凑出更长的序列。


💻 代码实现 (Java)

代码相比官方题解做了变量名的语义化修改,使其更符合工程规范,方便阅读。

class Solution { public int longestConsecutive(int[] nums) { // 1. 预处理:将数组元素放入 HashSet,实现去重和 O(1) 查询 Set<Integer> numSet = new HashSet<>(); for (int num : nums) { numSet.add(num); } int maxLen = 0; int totalNums = numSet.size(); // 2. 遍历集合中的每个元素 for (int num : numSet) { // 核心剪枝逻辑: // 只有当 num-1 不存在时,num 才是一个连续序列的【起点】 // 如果 num-1 存在,说明 num 已经被计算过了,直接跳过 if (!numSet.contains(num - 1)) { int currentNum = num; int currentLen = 1; // 从起点开始,不断向后寻找连续的数字 while (numSet.contains(currentNum + 1)) { currentNum += 1; currentLen += 1; } // 更新最大长度 maxLen = Math.max(maxLen, currentLen); // 【可选优化】:如果当前找到的长度已经超过总数的一半, // 那么剩下的元素不可能组成更长的序列,直接退出 if (maxLen > totalNums / 2) { break; } } } return maxLen; } }

🔍 复杂度分析

  • 时间复杂度:O(n)

    • 虽然代码里有一个while循环嵌套在for循环里,但仔细分析会发现:由于if (!numSet.contains(num - 1))的限制,数组中的每个数最多只会被访问两次(一次是作为序列起点被访问,一次是作为序列的一部分被内部while访问)。

    • 因此总的操作次数是线性的。

  • 空间复杂度:O(n)

    • 我们需要一个HashSet来存储数组中的元素,以空间换时间。

🎯 总结

这道题是哈希表运用的典范。解决很多 O(n) 复杂度问题的秘诀往往就在于“如何避免重复计算”。在这道题里,通过判断x-1是否存在,精准地锁定了每个序列的头部,从而避免了大量的无效枚举。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 18:15:43

杨建允:AI搜索趋势对留学服务行业的影响

AI搜索正深刻重塑留学服务行业&#xff0c;通过技术赋能和模式创新推动行业升级&#xff0c;同时带来新的挑战。主要影响在以下几个方向&#xff1a; 一、AI如何改变留学服务 1.‌效率革新 ‌智能选校‌&#xff1a;AI通过分析学生成绩、兴趣等数据&#xff0c;快速匹配院校&am…

作者头像 李华
网站建设 2026/4/23 15:51:18

Docker学习笔记—day012

Docker学习笔记—day012&#xff08;容器化编排&#xff09; 文章目录一、Docker-Compose1.1、docker-compose是什么1.2、docker-compose能干什么1.3、docker-compose下载1.4、docker-compose核心概念1.5、docker-compose使用的三个步骤1.6、docker-compose使用的三个步骤二、D…

作者头像 李华
网站建设 2026/4/17 2:00:15

ansible事实详解

Ansible 事实是 Ansible 在执行任务前&#xff0c;自动从受控节点收集的系统信息集合&#xff0c;这些信息会以变量形式存储&#xff0c;能直接用于区分不同节点的配置逻辑&#xff0c;实现自动化任务的差异化执行。1. 核心收集的信息类型• 基础主机信息&#xff1a;包含主机…

作者头像 李华
网站建设 2026/4/22 21:26:47

机器学习资源合集

Python数据分析与机器学习实战课程 文件大小: 15.6GB内容特色: 15.6GB Python数据机器学习全流程项目源码适用人群: 想转岗AI/数据岗的大学生与程序员核心价值: 代码即用&#xff0c;快速复现Kaggle级建模与调优下载链接: https://pan.quark.cn/s/e349f01253fa 【数据技术课堂…

作者头像 李华
网站建设 2026/4/23 11:29:49

朴易天下:铁板神数的起源及流派介绍

第二十二章&#xff1a;铁板神数铁版神数是中国古代命理术数之一&#xff0c;相传由宋朝时的邵雍&#xff08;邵康节&#xff09;所发明&#xff0c;这个说法没有确实的证据。铁板神数兴盛于清代。相传铁板神数大师仅靠算盘拨算几下&#xff0c;以查条文形式批命&#xff0c;便…

作者头像 李华
网站建设 2026/4/23 13:24:36

COMSOL助力煤层注气热力流THM耦合下增强甲烷开采探索

一、COMSOL实现煤层注气热力流THM耦合下增强甲烷开采。 本案例采用热力流三场耦合&#xff0c;分析煤层注入CO2增强甲烷开采效果&#xff0c;涉及热-流-固数学模型、多气相介质作用&#xff0c;全部为PDE模块。 二、可以出煤层温度、瓦斯含量、渗透率等许多云图及数据&#xff…

作者头像 李华