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

LeetCode-041:缺失的第一个正数,把数组当哈希表,原地放回“该在的位置”

本题在线练习:LeetCode 41. 缺失的第一个正数 - 在线练习(免费 · 无需登录 · AI 辅助)(https://onefly.top/zero2Leetcode/playground.html?id=41)

配套刷题网站 Zero2Leetcode —— 内置本地 OJ + AI 教练,零门槛开始刷 Hot 100。

题目概述

给定一个未排序整数数组 nums,找出其中缺失的最小正整数。

要求:时间 O(n),额外空间 O(1)

这题的难点在于:既要线性时间,又不能用额外哈希集合。正确思路是“原地哈希”:把值 x 放回它应该在的位置 x-1

核心思路:答案只可能在 [1, n+1]

数组长度为 n,如果 1..n 都存在,那么最小缺失正数就是 n+1

所以只需要关心区间 [1, n] 内的数,其他(负数、0、>n)都可以忽略。

目标:让数组满足尽可能多的“值归位”:

如果数组里有数 x(1<=x<=n),就尝试把它放到下标 x-1 的位置上。

归位完成后,再从头扫一遍,找到第一个 nums[i] != i+1 的位置,答案就是 i+1

代码实现(原地交换归位)

class Solution:def firstMissingPositive(self, nums: list[int]) -> int:n = len(nums)i = 0while i < n:x = nums[i]# x 应该放在 idx = x-1if 1 <= x <= n and nums[x - 1] != x:nums[i], nums[x - 1] = nums[x - 1], nums[i]else:i += 1for i in range(n):if nums[i] != i + 1:return i + 1return n + 1

逐行拆解:为什么要用 while 而不是 for

因为交换后 nums[i] 变成了一个新值,可能仍然需要继续归位。

while

  • 如果发生交换,不增加 i,继续处理当前位置
  • 如果不需要交换,才 i += 1

这样能确保每个值最多被交换到位一次,整体仍是 O(n)

手动模拟:nums = [3,4,-1,1]

n=4,只关心 1..4。

  1. i=0,x=3 应放到 idx=2:交换 -> [-1,4,3,1]
  2. i=0,x=-1 无视,i=1
  3. i=1,x=4 应放到 idx=3:交换 -> [-1,1,3,4]
  4. i=1,x=1 应放到 idx=0:交换 -> [1,-1,3,4]
  5. i=1,x=-1 无视,继续

归位后从头扫:

  • i=0 是 1 对
  • i=1 不是 2,答案 = 2

复杂度分析

  • 时间:O(n)(每个元素交换次数有限)
  • 空间:O(1)

总结

缺失的第一个正数的关键思路是“原地哈希”:

  1. 只关心 [1, n]
  2. 把值 x 放到下标 x-1
  3. 再线性扫描找第一个不匹配的位置

把“数组当哈希表”这个技巧吃透,后面很多原地题(找缺失数、找重复数的变种)都会更有把握。

http://www.jsqmd.com/news/541436/

相关文章:

  • 使用小龙虾来操作猿编程的遥控车
  • 02.Linux常用文件操作命令
  • Python MCP协议实战指南:深度解析RFC-8888兼容实现与5大核心中间件集成(附GitHub Star 1.2k模板库)
  • 魔兽争霸III终极优化指南:WarcraftHelper插件完全使用教程
  • BMH23M001 24位Σ-Δ ADC模块技术解析与高精度测量实践
  • 【华为OD机试真题】伐木工 · 木材切割收益最大化问题(C语言)
  • 给 Agent 添加工具调用能力:搜索/计算/API
  • Nimbus:一个统一的具身合成数据生成框架
  • 2026年点胶机厂家权威推荐榜:视觉点胶机/非标灌胶机定制/非标点胶机定制/高精度灌胶机/高精度点胶机/选择指南 - 优质品牌商家
  • AMBER新手入门:5步搞定分子动力学模拟(附ff14SB力场配置指南)
  • FFmpeg 中编译和使用 soxr 重采样引擎
  • 嵌入式OLED UI组件库:轻量级C++组件化设计
  • C++ Template 特化机制详解
  • SEO_掌握核心算法,解读SEO排名背后的原因
  • 上海小程序开发公司三项测评:报价透明度,交付准时率,售后响应度
  • SEO_从基础到精通的SEO完整学习路径介绍(437 )
  • Tasker:裸机嵌入式轻量级任务调度器
  • Multisim仿真-FSK调制系统设计与性能优化
  • Webots新手避坑:用SolidReference搞定并联闭环机构,让轮腿机器人不再‘散架’
  • springboot框架高校大学生竞赛项目管理系统
  • jspssm基于Web的动漫网站论坛交流的设计与实现_n99n6cvu
  • 百川2-13B-4bits量化版对比测试:OpenClaw日常任务执行效率报告
  • QQ空间历史说说备份极简方案:从配置到导出的安全实践指南
  • LFM2.5-1.2B-Thinking-GGUF前端面试题解析实战:模拟面试与答案生成
  • 从测绘‘平差’到视觉SLAM:用Ceres手把手实现VINS中的Bundle Adjustment
  • Go Mutex 与 RWMutex 性能对比
  • 10吨燃气蒸汽锅炉价格对比
  • 在单细胞测序数据分析中,barcodes、features和matrix是三个最核心的基础文件,它们共同构成了所有分析的基石。
  • 做了十几年财务,我用RPA把最累的工作交给了“机器人”
  • 基于Matlab的正态云模型花卉特征提取:从理论到代码实现