news 2026/9/1 16:12:21

41. 缺失的第一个正数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
41. 缺失的第一个正数

41. 缺失的第一个正数

困难

给你一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案。

示例 1:

输入:nums = [1,2,0] 输出:3 解释:范围 [1,2] 中的数字都在数组中。

示例 2:

输入:nums = [3,4,-1,1] 输出:2 解释:1 在数组中,但 2 没有。

示例 3:

输入:nums = [7,8,9,11,12] 输出:1 解释:最小的正数 1 没有出现。

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1

📝 核心笔记:缺失的第一个正数 (原地哈希)

1. 核心思想 (一句话总结)

“一个萝卜一个坑”。

利用数组下标作为哈希表的 Key。我们要把数值 x 强行交换到下标 x-1 的位置上(例如:数值 1 放下标 0,数值 3 放下标 2)。

💡 直观理解:

想象你在整理杂乱的带有编号的球(1号球、5号球...)。

规则是:拿到 k号球,就把它扔到 第 k-1 个 盒子里。

最后从头检查盒子,第一个“球号不对应”的盒子,就是缺少的那个球。

2. 算法流程 (归位 -> 查岗)
  1. 归位 (Swapping):遍历数组,只要当前数字nums[i]是个“正经数”(在1n之间),并且它没在正确的位置上,就把它交换到正确的位置去。
    • 注意:交换回来的新数字可能还需要继续交换,所以用while
  1. 查岗 (Checking):再次遍历数组,看哪个下标i里的数字不是i+1
  2. 兜底:如果全都对上了,说明缺的是n+1

🔍 代码回忆清单 (关键点注释)

// 题目:LC 41. 缺失的第一个正数 class Solution { public int firstMissingPositive(int[] nums) { int n = nums.length; for (int i = 0; i < n; i++) { // 关键点1:While循环 (不是 if) // 只要拿到的数字符合要求,且没归位,就一直换,直到换无可换 while (nums[i] >= 1 && nums[i] <= n && nums[i] != nums[nums[i] - 1]) { // 防死循环:如果目标位置已经是正确的数字,就别换了 // 关键点2:交换逻辑 (把 x 放到 x-1 处) swap(nums, i, nums[i] - 1); } } // 关键点3:寻找第一个不匹配的 for (int i = 0; i < n; i++) { if (nums[i] != i + 1) { return i + 1; // 找到了!缺的就是 i+1 } } return n + 1; // 既然 1~n 都在,那缺的就是 n+1 } private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }

⚡ 快速复习 CheckList (易错点)

  • [ ]为什么用while
    • 这是最容易错的地方。交换过来的新数字nums[i]可能还是错的(例如把5换走了,换回来个3),3也得去它该去的地方,所以要一直换,直到当前位置无法再处理为止。
  • [ ]循环终止条件?
    1. 数字越界 (<=0>n):没地方放,不管它。
    2. 目标位置已经对了 (nums[i] == nums[target]):避免死循环(比如两个位置都是5,无限互换)。
  • [ ]时间复杂度?
    • 虽然是双重循环,但每个数字最多被交换一次归位。整体是 O(N)。

🖼️ 场景模拟

数组:[3, 4, -1, 1]

  • i=0 (Val=3):3 应该去下标 2。交换!->[-1, 4, 3, 1]
  • i=0 (Val=-1):-1 没地方去,跳过。
  • i=1 (Val=4):4 应该去下标 3。交换!->[-1, 1, 3, 4]
  • i=1 (Val=1):1 应该去下标 0。交换!->[1, -1, 3, 4]
  • i=1 (Val=-1):-1 跳过。
  • ...
  • 最后检查:下标 1 的值是 -1 (应该是 2)。返回 2
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 4:53:21

FOTA升级进阶指南:文件系统直接升级+串口分段升级

FOTA&#xff08;Firmware Over-The-Air&#xff09;是固件远程升级的简称&#xff0c;用于设备固件的远程更新和维护。 主要优势包括&#xff1a; 远程维护&#xff1a; 无需现场操作即可完成设备固件更新&#xff1b; 故障修复&#xff1a; 快速修复已部署设备的软件缺陷&a…

作者头像 李华
网站建设 2026/9/1 13:07:40

2026年EOR名义雇主服务优势TOP8对比榜单,助力全球化布局与用工优化

在全球化背景下&#xff0c;EOR名义雇主服务为企业提供了独特的优势。这种模式使得企业能够灵活雇佣和管理海外员工&#xff0c;快速适应各国的法律要求。通过EOR名义雇主&#xff0c;企业不仅减少了合规风险&#xff0c;还能够高效地处理薪资、福利和税务等问题。与此同时&…

作者头像 李华
网站建设 2026/9/1 10:12:15

DEX的暗黑森林:5个技术陷阱如何吞噬你的百万美元开发预算

引言&#xff1a;DEX的狂欢与代价2025年&#xff0c;全球去中心化交易所&#xff08;DEX&#xff09;日均交易量突破120亿美元&#xff0c;Uniswap、dYdX等头部平台占据加密货币交易37%的市场份额。在这场去中心化金融&#xff08;DeFi&#xff09;的盛宴中&#xff0c;每天有超…

作者头像 李华
网站建设 2026/9/1 23:40:37

JavaScript 原生 sort() 方法详解

JavaScript 原生 sort() 方法详解一、基本语法javascript// 语法 arr.sort([compareFunction])// 返回值&#xff1a;排序后的原数组&#xff08;原地修改&#xff09; const sortedArray arr.sort(compareFunction);二、默认行为&#xff08;不使用比较函数&#xff09;1. 字…

作者头像 李华
网站建设 2026/9/1 16:09:14

OE 平台是什么?基于多来源数字内容管理需求形成的海外工具型平台

OE 平台通常被归纳为一类海外数字内容管理工具&#xff0c;其形成背景并非单一业务需求&#xff0c;而是源于数字内容在不同平台、不同模块中不断分散后所产生的集中管理需求。从平台属性来看&#xff0c;OE 更接近于信息与内容的管理层工具&#xff0c;而非具体功能或服务平台…

作者头像 李华
网站建设 2026/9/1 2:57:19

LobeChat能否绘制思维导图?结构化思考好伙伴

LobeChat能否绘制思维导图&#xff1f;结构化思考好伙伴 在知识爆炸的时代&#xff0c;我们每天都在处理海量信息——会议纪要、读书笔记、项目规划……但真正能被内化和复用的却少之又少。一个核心问题在于&#xff1a;人类擅长线性表达&#xff0c;却不善结构化组织。于是&a…

作者头像 李华