当前位置: 首页 > news >正文

【Hot100|3 LeetCode 128. 最长连续序列】

这段代码是解决「LeetCode 128. 最长连续序列」问题的经典高效解法,核心思路是利用哈希集合(HashSet)的快速查找特性,通过 “判断序列起点 + 向后延伸” 的方式,在 O(n) 时间复杂度内找到最长的连续元素序列。下面从「问题理解→核心思路→代码逐行解析→实例演示」四个维度详细讲解:

一、问题理解

「最长连续序列」问题要求:给定一个未排序的整数数组 nums,找出其中最长的连续元素序列的长度(连续指的是数值连续,如 1,2,3,4 是长度为 4 的连续序列,100,200 是长度为 1 的两个独立序列)。限制:算法的时间复杂度需尽可能低(最好能达到 O(n))。

二、核心思路

暴力解法(排序后遍历)的时间复杂度是 O(n log n)(受排序影响),而该解法通过哈希集合优化查找效率,核心思路是:

  1. 去重 + 快速查找:用 HashSet 存储所有元素,既去重(重复元素不影响连续序列长度),又支持 O(1) 时间判断元素是否存在。
  2. 只从序列起点计算长度:对于每个元素 x,只有当 x-1 不存在于集合中时,x 才是某个连续序列的起点(避免对同一序列的中间元素重复计算)。
  3. 向后延伸计算长度:从起点 x 开始,依次检查 x+1, x+2, ... 是否存在,直到找不到为止,这段连续序列的长度为 y - xy 是第一个不存在的元素)。

三、代码逐行解析

java

运行

class Solution {public int longestConsecutive(int[] nums) {// 1. 创建HashSet存储所有元素(去重+O(1)查找)Set<Integer> st = new HashSet<>();for (int num : nums) {st.add(num);}// 2. 记录最长连续序列的长度(初始为0,空数组时直接返回0)int ans = 0;// 3. 遍历集合中的每个元素for (int x : st) {// 3.1 判断x是否是连续序列的起点:若x-1存在,说明x不是起点,跳过if (st.contains(x - 1)) {continue;}// 3.2 若x是起点,向后延伸找最长连续序列int y = x + 1; // 从x的下一个元素开始检查while (st.contains(y)) { // 只要y存在,就继续向后找y++;}// 3.3 计算当前连续序列的长度(y - x),更新最长长度ans = Math.max(ans, y - x);}// 4. 返回最长连续序列的长度return ans;}
}
关键细节拆解:
  1. HashSet 的作用Set<Integer> st = new HashSet<>() 及循环 st.add(num)

    • 去重:数组中重复的元素(如 [1,1,2])在集合中只会保留一个,避免重复处理。
    • 快速查找:st.contains() 方法的时间复杂度是 O(1),为后续 “判断起点” 和 “向后延伸” 提供高效支持。
  2. 判断序列起点的核心逻辑if (st.contains(x - 1)) { continue; }

    • 若 x-1 存在于集合中,说明 x 不是某个连续序列的起点(因为 x-1 才是更前面的元素),此时跳过 x 可避免重复计算(例如序列 1,2,3,4 中,x=2 时 x-1=1 存在,跳过;只从 x=1 开始计算)。
    • 若 x-1 不存在,说明 x 是起点,此时需要计算从 x 开始的连续序列长度。
  3. 向后延伸计算长度

    • int y = x + 1:从起点 x 的下一个元素开始检查。
    • while (st.contains(y)) { y++; }:只要 y 存在于集合中,就继续向后移动 y(例如 x=1 时,y 会依次变为 2,3,4,直到 y=5 不存在为止)。
    • y - x:此时 y 是第一个不在序列中的元素,因此 x 到 y-1 的连续序列长度为 y - x(如 x=1, y=5 时,长度为 5-1=4)。
  4. 更新最长长度ans = Math.max(ans, y - x):用当前序列的长度更新全局最长长度,最终 ans 就是结果。

四、实例演示

以测试用例 nums = [100, 4, 200, 1, 3, 2] 为例,演示执行过程:

  1. 去重后集合st = {100, 4, 200, 1, 3, 2}

  2. 初始化ans = 0

  3. 遍历集合元素

    • x=100:检查 x-1=99 是否存在?否(是起点)。y=101st 中无 101,长度 101-100=1 → ans=1
    • x=4:检查 x-1=3 是否存在?是(3 在集合中)→ 跳过。
    • x=200:检查 x-1=199 是否存在?否(是起点)。y=201,无 → 长度 1 → ans 仍为 1。
    • x=1:检查 x-1=0 是否存在?否(是起点)。y=2(存在)→ y=3(存在)→ y=4(存在)→ y=5(不存在)。长度 5-1=4 → ans=4
    • x=3:检查 x-1=2 是否存在?是 → 跳过。
    • x=2:检查 x-1=1 是否存在?是 → 跳过。
  4. 最终结果ans=4(对应序列 1,2,3,4)。

五、复杂度分析

  • 时间复杂度O(n)每个元素最多被访问两次:一次是在遍历集合时作为 x 被检查,一次是在 while 循环中作为 y 被延伸(例如 1,2,3,4 中,1 被检查一次,2,3,4 被 while 循环访问一次)。整体遍历次数为 O(n)
  • 空间复杂度O(n)哈希集合需要存储所有元素,最坏情况下(无重复元素)空间为 O(n)

总结

该解法的核心是通过 “只处理序列起点” 避免重复计算,结合哈希集合的 O(1) 查找特性,将时间复杂度优化到线性级别,是解决该问题的最优方案之一。这种 “利用哈希表优化查找 + 精准定位计算起点” 的思路,也是面试中高频考察的算法设计思想。

http://www.dtcms.com/a/576981.html

相关文章:

  • 一键搭建 Coze 智能体对话页面:支持流式输出 + 图片直显,开发效率拉满!
  • 十大免费ae模板网站短视频素材下载网站
  • 那里做直播网站网页打不开是什么问题
  • 论文分享 | AirRoom:物体是关键!革新室内房间重识别的新范式
  • 游戏 IPA 如何防修改,面向开发者的多工具实战(IPA 加固/无源码混淆/Ipa Guard CLI)
  • 从0到1做一个“字母拼词”Unity小游戏(含源码/GIF)- 项目的创建及准备
  • 在扣子上搭建测试用例自动编写智能体
  • 2023年第二十届五一数学建模竞赛-A题 无人机定点投放问题-基于抛体运动的无人机定点投放问题研究
  • 影刀RPA一键生成销售日报!AI智能分析,效率提升1000%[特殊字符]
  • Rust开发实战之密码学基础——哈希计算与对称加密实战
  • 技术解析:清洗无人机在高空清洁中的应用与优势
  • Linux LVM NAT 模式部署实践
  • 使用 DVC(Data Version Control)进行数据版本管理
  • 网站建设选择哪种开发语言最好从哪里下载wordpress
  • 微服务之网关(Spring Cloud Gateway)
  • ES脚本语言Painless介绍
  • 基于MATLAB的雨流计数法疲劳计算GUI可视化系统
  • WiFi 协议精读:IEEE 802.11-2012,IEEE Std 802.11w™-2009: Protected Management Frames
  • RabbitMQ-Exporter 监控 TLS 加密的 RabbitMQ 集群
  • 重庆佳宇建设集团网站重庆网站自己推广
  • 品牌营销策划网站wordpress 会员开卡消费
  • iOS修改tabbar的背景图
  • 《uni-app跨平台开发完全指南》- 04 - 页面布局与样式基础
  • 【学习笔记更新中】Deeplearning.AI 大语言模型后训练:微调与强化学习导论
  • SQL之表的时间类内置函数详解
  • 线性代数 - 奇异值分解(SVD Singular Value Decomposition)- 计算顺序 旋转→拉伸→旋转
  • html的input的required
  • 【开题答辩全过程】以 基于Java的医务室病历管理小程序为例,包含答辩的问题和答案
  • 移除 XSLT,以更强的浏览器安全边界迎面而来
  • 回溯剪枝的“减法艺术”:化解超时危机的 “救命稻草”(三)