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

41. 缺失的第一个正数

1. 题目

41. 缺失的第一个正数 - 力扣(LeetCode)

2. 解题思路

2.1. 理想状态

数组长度是 n,那么我们只关心 1 到 n 这些数字。
如果一切完美,数组应该长这样:

下标:   0   1   2   3   ... n-1
数值:   1   2   3   4   ... n

也就是 数值 = 下标+1

[!question] 为什么只关心1到n
因为求的是缺失的最小的正整数,所以我们只要关心到n

  • 如果数组里 1…n 这些数都出现了,那么前 n 个正整数就全齐了,缺失的第一个正数只能是 n+1
  • 如果数组里 1…n 里有某个没出现,那缺失的第一个正数一定落在这段范围里。

换句话说:答案一定在 1…n+1 之间,不会比 n+1 更大。

2.2. 把数放回该在的位置

如果某个数 x1…n 之间,那它应该待在位置 x-1 上。
所以我们扫描数组,发现不对劲就交换:

  • 举个例子:数值 3 出现在下标 0 上,它应该去下标 2
  • 于是我们把它和下标 2 的数交换。

这样反复交换,最后所有合法的数都会“归位”。

2.3. 答案匹配

  • 如果某个数缺失了,那它对应的位置一定不会对上。
    比如 2 不存在,那么在下标 1 上就不可能出现 2,最后一定能发现。
  • 扫描一遍数组:
    • 如果第一个不匹配的是 i 位置,那缺的就是 i+1
    • 如果全部都对上了,说明 1..n 全都存在,缺的就是 n+1

2.4. 举例[3, 4, -1, 1]

  • 长度是 4,我们只关心数字 1..4
  • 开始放数归位:
    • 下标 0 是 3,不对 → 和下标 2 交换 → [ -1, 4, 3, 1 ]
    • 下标 0 是 -1(无效数),跳过
    • 下标 1 是 4,不对 → 和下标 3 交换 → [ -1, 1, 3, 4 ]
    • 下标 1 是 1,不对 → 和下标 0 交换 → [ 1, -1, 3, 4 ]
  • 此时数组变成 [1, -1, 3, 4]
  • 扫描:
    • 位置 0 对上(1)。
    • 位置 1 错(应该是 2,实际是 -1)。
    • 所以缺的就是 2

3. 代码

3.1. 完整代码

class Solution {public int firstMissingPositive(int[] nums) {int n = nums.length;for (int i = 0; i < n; i++) {while (nums[i] > 0 && nums[i] <= n && nums[i] != i + 1) {int correctIndex = nums[i] - 1;// 如果目标位置已经是同样的数,就不要交换,避免死循环,比如case:[1,1]if (nums[correctIndex] == nums[i]) {break;}int temp = nums[correctIndex];nums[correctIndex] = nums[i];nums[i] = temp;}}for (int i = 0; i < n; i++) {if (i + 1 != nums[i]) {return i + 1;}}return n + 1;}
}

3.2. 注意点

while循环中:nums[i] != i + 1,如果一直交换不到正确数字会死循环吗?
不会的。只有在「当前数值在有效范围 1…n 且不在自己该在的位置」时才交换。


文章转载自:

http://yq5aoCoO.mgbcf.cn
http://yE8UgyjU.mgbcf.cn
http://l6N0jQtG.mgbcf.cn
http://1ysreylA.mgbcf.cn
http://IWjplHOi.mgbcf.cn
http://t7riDpEw.mgbcf.cn
http://ngU8xHdt.mgbcf.cn
http://l0ZCYSad.mgbcf.cn
http://vfYRuBSl.mgbcf.cn
http://ArXdLE8U.mgbcf.cn
http://4k1aK5Qk.mgbcf.cn
http://7hXq2vjq.mgbcf.cn
http://mo9skZmF.mgbcf.cn
http://q0DProbI.mgbcf.cn
http://8IxqhbPh.mgbcf.cn
http://EnNeOjr7.mgbcf.cn
http://gqYYuTAP.mgbcf.cn
http://C3CGJvAZ.mgbcf.cn
http://5LiJyuPu.mgbcf.cn
http://h4WndP4v.mgbcf.cn
http://e4eNxJ9R.mgbcf.cn
http://RnJzdX6q.mgbcf.cn
http://bIOUxVDX.mgbcf.cn
http://xxmLKrRH.mgbcf.cn
http://VMttC0W6.mgbcf.cn
http://5FBAsuHu.mgbcf.cn
http://lr0i9JW7.mgbcf.cn
http://2aEkIdjl.mgbcf.cn
http://ELwp4Whv.mgbcf.cn
http://XJH79HlH.mgbcf.cn
http://www.dtcms.com/a/365876.html

相关文章:

  • Shapely
  • 洛谷 P1077 [NOIP 2012 普及组] 摆花-普及-
  • PostgreSQL 索引使用分析2
  • 多线程同步安全机制
  • InnoDB存储引擎-锁
  • 电子信息类学生必看!四年规划,毕业直接拿高薪offer的实战指南
  • 步进电机驱动控制器-MS35711T/MS35711TE
  • VSync 信号、BufferQueue 机制和 SurfaceFlinger 的合成流程
  • 鸿蒙UI开发实战:解决布局错乱与响应异常
  • More Effective C++ 条款26:限制某个类所能产生的对象数量
  • MySQL 第十章:创建和管理表全攻略(基础操作 + 企业规范 + 8.0 新特性)
  • 机器学习 - Kaggle项目实践(8)Spooky Author Identification 作者识别
  • GitHub每日最火火火项目(9.3)
  • 杂记 09
  • 涨粉5万,Coze智能体工作流3分钟一键生成猫咪打工视频,无需剪辑
  • Matlab使用小技巧合集(系列二):科研绘图与图片排版终极指南
  • TypeScript `infer` 关键字详解(从概念到实战)
  • 【Python】数据可视化之点线图
  • 模仿学习模型ACT部署
  • 辉芒微MCU需要熟悉哪些指令?这15条核心指令与入门要点必须掌握
  • Linux gzip 命令详解:从基础到高级用法
  • Python基础(①①Ctypes)
  • C 内存对齐踩坑记录
  • 【随手记】vscode中C语言满足KR风格的方法
  • Elasticsearch核心数据类型
  • 深度学习——卷积神经网络
  • AI产品经理面试宝典第84天:RAG系统架构设计与优化策略面试指南
  • 分布式AI算力系统番外篇-----超体的现世《星核》
  • 【Doris入门】Doris数据表模型使用指南:核心注意事项与实践
  • 从PkiAsn1Decode函数到ASN1Dec_SignedDataWithBlobs函数