LeetCode128:哈希集合巧解最长连续序列

LeetCode128:哈希集合巧解最长连续序列

一、题目回顾

LeetCode 128 题「最长连续序列」是一道中等难度的数组题,核心要求如下:给定一个未排序的整数数组 nums,找出其中数字连续的最长序列(不要求序列元素在原数组中连续)的长度,且必须设计时间复杂度为 O (n) 的算法。

示例直观理解:

  • 输入 nums = [100,4,200,1,3,2],输出 4(最长序列是 [1,2,3,4]);
  • 输入 nums = [0,3,7,2,5,8,4,6,0,1],输出 9(完整连续序列 0-8)。

二、解法思路:哈希集合 + 起点判定

题目要求 O (n) 时间,因此不能用排序(排序时间 O (nlogn)),需要借助「哈希集合」的快速查找特性(查找操作 O (1))。

核心思路是:

  1. 将数组元素存入哈希集合,实现 “是否存在某数” 的快速判断;
  2. 遍历集合中的每个数 x仅当 x-1 不在集合中时,才将 x 作为 “连续序列的起点”;
  3. 从起点 x 开始,依次查找 x+1、x+2... 是否在集合中,统计该序列的长度;
  4. 维护一个全局变量,记录所有序列的最长长度。

这个思路的巧妙之处在于:非起点的数会被跳过,每个数只会被遍历一次,从而保证整体时间复杂度为 O (n)。

三、C++ 代码解析

先看完整代码,再逐行拆解:

cpp

运行

class Solution { public: int longestConsecutive(vector<int>& nums) { // 1. 将数组元素存入哈希集合(去重+快速查找) unordered_set<int> hash(nums.begin(), nums.end()); int len = 0; // 记录最长序列长度 // 2. 遍历集合中的每个数 for (int x : hash) { // 3. 仅当x-1不存在时,x才是序列起点(避免重复计算) if (hash.count(x - 1)) { continue; } // 4. 从起点x开始,扩展连续序列 int y = x + 1; while (hash.count(y)) { ++y; } // 5. 更新最长长度(y-x是当前序列的长度) len = max(len, y - x); } return len; } }; 

代码关键细节

  1. 哈希集合的作用
    • 用 unordered_set 存储数组元素,既实现了去重(重复元素不影响连续序列长度),又能在 O (1) 时间内判断某数是否存在。
  2. 起点判定逻辑
    • if (hash.count(x - 1)) continue;:如果 x-1 存在,说明 x 不是当前连续序列的起点(比如 x=2 时,若 x-1=1 存在,则 2 属于以 1 为起点的序列),直接跳过,避免重复遍历。
  3. 序列长度计算
    • 从起点 x 出发,用 y 不断向后扩展(y++),直到 y 不在集合中,此时 y - x 就是当前连续序列的长度。

四、复杂度分析

  • 时间复杂度:O(n)
    • 存入集合的时间是 O (n);
    • 遍历集合时,每个元素最多被访问 1 次(只有起点会触发后续的扩展循环,非起点会被跳过),因此整体遍历时间是 O (n)。
  • 空间复杂度:O(n)
    • 哈希集合存储了数组的所有元素,空间开销与数组长度成正比。

五、解法小结

这个解法的核心是通过 “起点判定” 避免重复计算,结合哈希集合的快速查找,既满足了 O (n) 的时间要求,又保证了逻辑的简洁性。

相比暴力解法(枚举每个数后遍历后续元素,时间 O (n²)),这个方法用空间换时间,是这道题的最优解之一。

Read more

Java 时间类(中):JDK8 全新时间 API 详细教程

Java 时间类(中):JDK8 全新时间 API 详细教程

🏠个人主页:黎雁 🎬作者简介:C/C++/JAVA后端开发学习者 ❄️个人专栏:C语言、数据结构(C语言)、EasyX、JAVA、游戏、规划、程序人生 ✨ 从来绝巘须孤往,万里同尘即玉京 文章目录 * Java 时间类(中):JDK8 全新时间 API 详细教程 🕘 * 📝 文章摘要 * 🧠 上篇知识回顾 * 一、JDK8 时间类整体架构 🏛 * 二、ZoneId 时区类 🌍 * 1. 核心作用 * 2. 常用方法 * 3. 代码示例 * 三、Instant 时间戳类 ⚡ * 1. 核心作用 * 2. 常用方法 * 3. 代码示例 * 四、ZonedDateTime

By Ne0inhk
JAVA IO流:从基础原理到实战应用

JAVA IO流:从基础原理到实战应用

JAVA IO流:从基础原理到实战应用 1.1 本章学习目标与重点 💡 掌握IO流的核心概念与分类,理解字节流与字符流的区别和适用场景。 💡 熟练使用字节流完成文件的读取与写入操作,解决文件拷贝等实际问题。 💡 掌握字符流的使用方法,处理文本文件的编码与解码问题。 💡 了解缓冲流、转换流、对象流等高级IO流的原理,提升IO操作效率。 ⚠️ 本章重点是 字节流与字符流的核心用法 和 高级IO流的实战应用,这是JAVA文件操作的必备技能。 1.2 IO流核心概念与分类 1.2.1 什么是IO流 💡 IO流(Input/Output Stream)是JAVA中用于处理设备之间数据传输的技术,主要负责数据的读取(Input)和写入(Output)。 常见的IO操作包括文件读写、网络通信数据传输等。IO流的核心思想是以流的方式处理数据,数据像水流一样从一个设备流向另一个设备,实现数据的传输与处理。 1.2.2 IO流的分类标准 JAVA中的IO流体系庞大,可按照不同标准进行分类,核心分类方式有以下三种: 1.

By Ne0inhk
依托Java和百度地图实现长沙市热门道路与景点实时路况检索的实践探索

依托Java和百度地图实现长沙市热门道路与景点实时路况检索的实践探索

目录 前言 一、实时路况服务简介 1、实时路况服务是什么 2、道路实时路况查询 3、周边实时路况查询 4、返回参数 二、Java响应对象封装 1、响应对象设计 2、响应对象实现 三、UniHttp集成及调用 1、检索接口声明 2、道路实时路况查询 3、周边实时路况查询 四、常见问题 1、道路名称错误 2、中心点坐标位置错误 3、坐标类型错误 4、命名的小插曲 五、总结 前言         在当今数字化时代,交通出行的便捷性与高效性已成为衡量城市智慧化水平的重要指标之一。随着城市化进程的加速,长沙市作为湖南省的省会城市,其交通流量日益复杂,再叠加现在的国庆旅游客流和中秋探亲客流,热门道路与景点的路况信息对于市民日常出行和游客旅游规划至关重要。因此,需要开发一套能够实时检索长沙市热门道路与景点路况的系统。         本实践探索旨在通过Java编程语言调用百度地图的API接口,实现对长沙市热门道路与景点的实时路况检索功能。

By Ne0inhk
java( Java 25 LTS)的下载、安装、配置 (IDEA 2025 为例)

java( Java 25 LTS)的下载、安装、配置 (IDEA 2025 为例)

一、Java 25 LTS 下载 Java 下载 |神谕https://www.oracle.com/java/technologies/downloads/#jdk25-windows 二、安装 2.1Windows 图形安装 首先双击下载的 jdk25.msi 文件,进入安装向导。 选择 Next 进入下一步。修改安装路径(建议 D:\Java\jdk-25)确保路径简洁无中文或空格。 勾选 Generate public JRE 选项,保持默认配置。 点击 Install 开始安装,完成后点击 Finish。 2.2macOS 安装 双击下载的 jdk-25.

By Ne0inhk