首页/新闻资讯/正文详情

算法通关手册:LeetCode 0041「缺失的第一个正数」——原地哈希实现 O(n) 时间与 O(1) 空间的完整剖析

发布时间:2026/9/28 2:59:34 来源:云帆数科 栏目:资讯中心
算法通关手册:LeetCode 0041「缺失的第一个正数」——原地哈希实现 O(n) 时间与 O(1) 空间的完整剖析
教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载本篇技术指南围绕 AlgoNote「算法通关手册」中 LeetCode 0041 缺失的第一个正数题解 展开深入讲解「原地哈希In-place Hashing」这一在数组类难题中极为重要的技巧。通过阅读本文你将掌握如何在不申请额外哈希表的前提下把数组本身当作哈希表使用从而同时满足时间复杂度O(n)与常数级空间复杂度的苛刻要求并能迁移到其他查找缺失/重复元素类问题中。题目概览题目编号0041中文题名缺失的第一个正数First Missing Positive标签数组、哈希表难度困难该题被收录在 0001-0099 题解目录、算法分类题单归类于「数组、哈希表」以及 面试 100 题清单 中是算法面试中考察「空间复杂度优化」的代表性题目。题目描述与约束描述给定一个未排序的整数数组nums。要求找出其中没有出现的最小的正整数。说明与数据范围1 ≤ nums.length ≤ 5 * 10^5-2^31 ≤ nums[i] ≤ 2^31 - 1要求实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案注意数据范围中的两个关键信息数组长度最大可达50 万元素取值横跨整个 32 位整数范围既有负数也有远超数组长度的大正数。这意味着任何基于排序O(n log n)或基于普通哈希集合O(n)空间的直接解法都不满足题目要求。示例示例 1输入nums [1,2,0] 输出31、2均已出现缺失的最小正整数为3。示例 2输入nums [3,4,-1,1] 输出21已出现2缺失因此答案为2。解题思路思路 1哈希表、原地哈希朴素思路及其局限如果使用普通的哈希表我们只需要遍历一遍数组将对应整数存入哈希表中再从1开始依次判断对应正数是否在哈希表中即可。但此时空间复杂度为O(n)不满足题目常数级别额外空间的要求。关键观察一个长度为n的数组能够承接的正整数范围是[1, n]。因此缺失的第一个正数要么落在[1, n]区间内要么当1 ~ n全部出现时就是n 1。换言之答案只可能来自[1, n 1]这个集合数组下标天然可以作为这些候选值的哈希地址。原地哈希的做法把当前数组本身视为一张哈希表让值为x的元素回到下标为x - 1的位置遍历一遍数组将当前元素放到其对应位置上。例如元素值为1的元素放到数组第0个位置元素值为2的元素放到数组第1个位置以此类推仅对值落在[1, n]范围内的元素执行归位其余元素可忽略。再次遍历数组。遇到第一个元素值不等于下标 1的位置该位置对应的正整数i 1就是缺失的第一个正数。如果遍历完都没有找到说明1 ~ n全部出现缺失的第一个正数是n 1。返回结果。这一思想的根基正是 哈希表专题 中介绍的「直接定址法」Hash(key) key此处再减去偏移量1映射到数组下标。由于答案的取值空间被严格限制在[1, n 1]直接定址不会产生冲突也就不需要任何冲突处理天然契合哈希函数计算简单、无冲突的理想要求。思路 1代码以下代码完整继承自 first-missing-positive.md并补充了关键注释class Solution: def firstMissingPositive(self, nums: List[int]) - int: size len(nums) # 第一遍遍历原地哈希把每个值 x1 x size放到下标 x - 1 处 for i in range(size): # 只有当值合法在 [1, size] 内且尚未归位时才进行交换 # nums[i] ! nums[nums[i] - 1] 这个条件同时防止了重复值导致的死循环 while 1 nums[i] size and nums[i] ! nums[nums[i] - 1]: index1 i index2 nums[i] - 1 nums[index1], nums[index2] nums[index2], nums[index1] # 第二遍遍历第一个位置错位处即缺失的第一个正数 for i in range(size): if nums[i] ! i 1: return i 1 # 1 ~ size 全部就位缺失的是 size 1 return size 1思路 1复杂度分析时间复杂度O(n)其中n为数组nums的元素个数。虽然第一遍遍历中存在while循环但每个元素至多被交换到正确位置一次交换次数整体不超过n因此均摊仍是线性复杂度。空间复杂度O(1)所有操作均在原数组上进行只使用常数级别的额外变量。代码细节与边界情况解析理解下面几个细节才能真正把这段代码吃透为什么交换而不是直接赋值直接nums[nums[i] - 1] nums[i]会覆盖掉目标位置上的原有值导致信息丢失。必须采用交换才能让被挤走的元素继续参与后续归位。while循环的终止条件nums[i] ! nums[nums[i] - 1]这一条件非常关键。当目标位置已经存放着相同值时即重复元素继续交换会造成两个相同值反复互换、陷入死循环。该条件在归位完成或遇到重复值时终止循环。值域过滤1 nums[i] size负数、0以及大于size的正数都不可能成为答案答案最大为size 1因此无需归位直接跳过。这也保证了交换操作永远不会越界访问。交换顺序的正确性代码先分别取出index1、index2再交换避免了在单行交换中因右侧求值顺序问题导致的错误是严谨的写法。边界用例演示nums [1]第一遍归位后仍为[1]第二遍nums[0] 1循环结束返回size 1 2。正确。nums [7, 8, 9, 11, 12]所有元素均超出[1, 5]不参与归位第二遍nums[0] ! 1立即返回1。正确。nums [1, 2, 0]0被过滤1、2归位后数组为[1, 2, 0]第二遍nums[2] ! 3返回3。与示例 1 一致。同源题型的横向延伸「原地哈希」并非本题独有它是在已知值域、查找缺失或重复类问题中的通用利器与本题共享同一套思维模型0268. 丢失的数字值域为[0, n]缺失数字同样可以借助数组下标定位该题题解还给出了数学求和这一O(1)空间的替代方案可作为对比阅读。0287. 寻找重复数值域为[1, n]查找重复元素题解提供了二分计数与可进一步推导的原地哈希/链表判环等不同路径。它们的共同特征是元素值域与数组长度强相关从而允许把值编码进下标。理解了 0041 的原地哈希后再回看上述题目会轻松很多。仓库中的延伸阅读数组基础与随机访问见 01_01_array_basic.md其中介绍了数组连续内存 下标寻址的特性这正是原地哈希能够成立的前提——下标本身就是 O(1) 的地址。哈希表基础见 03_06_hash_table.md其中「直接定址法」「哈希函数设计」两节与本题的映射思路直接对应。本题在仓库中的归类与收录见 0001-0099 题解目录、算法分类题单、面试 100 题清单 与 题解总目录。小结「缺失的第一个正数」是极少数同时卡住时间O(n)与空间O(1)两道硬性约束的数组难题其破局点在于三个层层递进的观察答案必然落在[1, n 1]数组下标可以充当哈希地址交换而非覆盖可以保证信息不丢失。掌握原地哈希后你不仅能独立 AC 本题还能将其推广到寻找重复数、丢失数字等一系列值与下标互相对应的经典问题中这是算法面试中值得反复打磨的一类核心技巧。赞分享教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载相关推荐N_m3u8DL-RE 流媒体下载完整指南M3U8/DASH/HLS 快速上手教程N_m3u8DL RE 流媒体下载完整指南M3U8/DASH/HLS 快速上手教程 N_m3u8DL RE 是一款跨平台的命令行流媒体下载工具支持 DASHCLI音视频LeetCode 41 缺失的第一个正数First Missing Positive五种解法与 O(1) 空间哈希技巧全解析LeetCode 41 缺失的第一个正数First Missing Positive五种解法与 O 1 空间哈希技巧全解析 本文基于 GitHub 推荐项示例工程教程LeetCode 136 只出现一次的数字用异或运算实现 O(n) 时间 O(1) 空间解法LeetCode 136 只出现一次的数字用异或运算实现 O n 时间 O 1 空间解法 导读 LeetCode 136「只出现一次的数字」Single N文档教程知识库上一篇终极跨平台Unity破解指南UniHacker完整使用教程下一篇如何用Layout Card彻底改造你的Home Assistant界面完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Apereo CAS 委托认证之 OAuth2.0:通过 Pac4j 集成外部 OAuth2 身份提供方实战指南
Apereo CAS 委托认证之 OAuth2.0:通过 Pac4j 集成外部 OAuth2 身份提供方实战指南

后端认证鉴权单点登录 【免费下载链接】cas Apereo CAS - Identity & Single Sign On for all earthlings and beyond. 项目地址: https://gitcode.com/gh_mirrors/ca/cas 点击查看 免费下载 本文是 Apereo CAS 委托认证(Delegated Authentication&… · 2026/9/28 2:59:34

NoneBot2 框架概览:异步优先、类型注解与依赖注入驱动的跨平台聊天机器人开发
NoneBot2 框架概览:异步优先、类型注解与依赖注入驱动的跨平台聊天机器人开发

后端即时通讯 【免费下载链接】nonebot2 跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python 项目地址: https://gitcode.com/gh_mirrors/no/nonebot2 点击查看 免费下载 NoneBot2 是一个现代、跨平台、可扩展的… · 2026/9/28 2:59:33

AlgoNote 算法通关手册:LeetCode 0046「全排列」回溯算法深度解析
AlgoNote 算法通关手册:LeetCode 0046「全排列」回溯算法深度解析

教程文档知识库 【免费下载链接】AlgoNote ⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000 道「LeetCode 题目解析」,持续更新中! 项目地址: https://gitcod… · 2026/9/28 2:59:33

Spingboot启动预热的实现
Spingboot启动预热的实现

启动预热的适用场景启动预热适合以下情况:数据主要来自第三方接口,无法直接从本地数据库读取。第三方接口响应较慢,首次访问容易超时。一个页面需要调用多个第三方接口或逐项查询。数据读取频繁,但变化不频繁。希望服务启动后&… · 2026/9/28 3:40:12

Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment
Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment

文章主要内容总结 本文研究了多模态大语言模型(具体为ChatGPT-4o)利用静态行车记录仪图像进行类人交通场景解读的潜力,重点聚焦与老年司机评估相关的三项任务:交通密度评估、交叉口可见性评估和停车标志识别。这些任务需上下文推理而非简单目标检测。研究采用零样本、少样… · 2026/9/28 3:32:43

Leveraging Large Language Models for Classifying App Users‘ Feedback
Leveraging Large Language Models for Classifying App Users‘ Feedback

文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)解决应用用户反馈分类的挑战,传统方法依赖有监督机器学习,但受限于标注数据集的规模和质量。研究通过三个核心实验评估了4种先进LLMs(GPT-3.5-Turbo、GPT-4o、Flan-T5、Llama3-70b)的性能: LLMs在用户反馈分类中的基… · 2026/9/28 3:32:43

Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...
Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...

文章主要内容总结 本文通过实验评估了大型语言模型(LLMs)在奥地利及欧盟增值税(VAT)法框架下辅助法律决策的能力。研究聚焦于两种提升LLM性能的方法——微调(fine-tuning)和检索增强生成(RAG),并在两类案例中进行验证:一是权威教科书案例,二是税务咨询公司的真实案… · 2026/9/28 3:32:43

学Java别走弯路,这5个方向最吃香
学Java别走弯路,这5个方向最吃香

学Java的人很多,但学明白的人不多。有人学了半年还在写控制台程序,有人一年就能独当一面。差别不在天赋,而在方向。Java生态太庞大了,什么都学等于什么都没学。选对方向,事半功倍。今天盘点当前最吃香的5个Java方向&am… · 2026/9/28 3:32:15

AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions
AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions

AlphaAgents相关总结与翻译 一、文章主要内容总结 (一)研究背景与问题 传统股票投资组合管理依赖人类分析师处理海量信息(如财务披露、财报、市场新闻等),存在信息处理效率低、易受认知偏差(如损失厌恶、过度自信)影响的问题,可能错失投资收益机会。尽管AI在数据处理… · 2026/9/28 3:32:08

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

制作网页比较方便的软件怎么选?一文搞懂避坑指南
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码