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

SGLang前端DSL语法详解:任务编排部署入门教程

SGLang前端DSL语法详解:任务编排部署入门教程 SGLang-v0.5.6 SGLang全称Structured Generation Language(结构化生成语言),是一个推理框架。主要解决大模型部署中的痛点,优化CPU和GPU,跑出更高的吞吐量。核心是尽量减少重复计算,让大家相对简单的用LLM。 1. SGLang 简介 SGLang全称Structured Generation Language(结构化生成语言),是一个推理框架。主要解决大模型部署中的痛点,优化CPU和GPU,跑出更高的吞吐量。核心是尽量减少重复计算,让大家相对简单的用LLM。 1.1 核心目标与设计思想 SGLang的设计初衷是让开发者能更轻松地构建复杂的LLM应用,而不只是停留在“输入问题、返回答案”这种简单交互上。它通过前后端分离的架构,把编程复杂度和运行效率做了明确分工: * 前端:提供一种叫DSL(Domain-Specific Language)的领域专用语言,让你可以用简洁的方式描述复杂的生成逻辑。 * 后端:专注性能优化,比如KV缓存管理、请求调度、多GPU协同等,确

By Ne0inhk

实测腾讯混元最强翻译模型,Hunyuan-MT-7B-WEBUI真香体验

实测腾讯混元最强翻译模型,Hunyuan-MT-7B-WEBUI真香体验 1. 引言:当高质量翻译遇上“开箱即用” 在多语言环境日益普及的今天,企业、教育机构乃至个人开发者对精准翻译的需求持续增长。尤其在涉及少数民族语言如藏语、维吾尔语、哈萨克语等场景下,通用翻译工具往往表现不佳,而专业服务又存在成本高、数据安全风险等问题。 正是在这样的背景下,Hunyuan-MT-7B-WEBUI 的出现显得尤为及时。作为腾讯混元团队推出的开源最强翻译模型镜像,它不仅支持38种语言互译(含5种民汉翻译),更通过集成Web界面实现了“一键部署、即点即用”的极致体验。无需编写代码、无需配置复杂依赖,即便是非技术人员也能在几分钟内完成本地化部署并开始使用。 本文将基于实际测试,深入解析 Hunyuan-MT-7B-WEBUI 的技术优势、部署流程、核心架构与工程实践建议,帮助读者全面掌握这一高效翻译解决方案的核心价值。 2. 模型能力解析:为何7B是翻译任务的黄金平衡点 2.1 参数规模的选择逻辑 在大模型时代,“越大越好”似乎成了默认共识。然而,在真实生产环境中,模型性能必须与硬件资源

By Ne0inhk

前端虚拟列表深度拆解

虚拟列表是为了解决什么问题 真实项目中的痛点: 想象一个后台系统:用户列表:10 万条;订单列表:20 万条;日志列表:百万级;表格里还有:多列、复杂 DOM、hover、操作按钮、状态标签 直接 map 渲染: data.map(item => <Row key={item.id} />) 会遇到:首次渲染卡死、滚动严重掉帧、内存暴涨和浏览器直接崩 根因只有一个:DOM 太多,浏览器不是怕 JS,浏览器最怕的是成千上万个 DOM 节点 总的来说虚拟列表就是只渲染可视区域内的列表项,而其余的用占位高度“假装存在” 虚拟列表的核心思想 我总结主要要理解这四点: 1.可视区域(

By Ne0inhk
WebGIS视角下基孔肯雅热流行风险地区分类实战解析

WebGIS视角下基孔肯雅热流行风险地区分类实战解析

目录 前言 一、关于基孔肯雅热 1、病原学特征 2、流行病学特征 3、疫情处置 4、预防措施 二、流行风险地区空间可视化 1、流行风险地区分类标准 2、空间查询基础 3、Leaflet空间可视化 三、流行风险地区WebGIS展示 1、Ⅰ类地区 2、Ⅱ类地区 3、Ⅲ类地区 4、Ⅳ类地区 四、总结 前言         在全球化与城市化进程不断加速的当下,传染病的传播范围与速度呈现出前所未有的态势,给公共卫生安全带来了严峻挑战。基孔肯雅热作为一种由基孔肯雅病毒引起的急性传染病,近年来在多个地区引发疫情,其传播速度快、感染范围广,且易与其他蚊媒传染病叠加流行,严重威胁着人类健康和社会稳定。准确划分基孔肯雅热流行风险地区,对于制定科学合理的防控策略、优化医疗资源配置以及提高公众防范意识具有至关重要的意义。         本研究旨在通过系统梳理 WebGIS 技术在传染病流行风险评估中的应用现状与优势,结合基孔肯雅热的流行特点和防控需求,构建一套基于

By Ne0inhk