news 2026/5/12 4:11:55

【LeetCode刷题】缺失的第一个正数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【LeetCode刷题】缺失的第一个正数

给你一个未排序的整数数组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 <=
  • -231 <= nums[i] <=

解题思路

要在 O (n) 时间复杂度和常数级额外空间内解决问题,核心思路是原地哈希(标记)

  1. 范围确定:缺失的最小正整数一定在[1, n+1]范围内(n 为数组长度)。例如数组长度为 3,若 1、2、3 都存在则返回 4,否则返回缺失的最小数。
  2. 过滤无效值:将数组中所有≤0 或 > n 的数替换为n+1(这些数不可能是目标,替换后不干扰后续标记)。
  3. 标记存在的数:遍历数组,对每个元素x(取绝对值),若x ≤ n,则将数组第x-1位标记为负数(表示x这个数存在)。
  4. 查找缺失值:遍历数组,第一个正数的位置i+1就是缺失的最小正整数;若全为负数,说明 1~n 都存在,返回n+1

示例验证

示例 1:输入nums = [1,2,0]
  1. 过滤无效值:0 替换为 4 →[1,2,4]
  2. 标记存在的数:
    • x=1 → nums[0] = -1;
    • x=2 → nums[1] = -2;
    • x=4(>3)→ 不处理;数组变为[-1,-2,4]
  3. 遍历找正数:索引 2 是第一个正数,返回2+1=3(符合预期)。
示例 2:输入nums = [3,4,-1,1]
  1. 过滤无效值:-1 替换为 5,4 替换为 5 →[3,5,5,1]
  2. 标记存在的数:
    • x=3 → nums[2] = -5;
    • x=5(>4)→ 不处理;
    • x=5(>4)→ 不处理;
    • x=1 → nums [0] = -3;数组变为[-3,5,-5,1]
  3. 遍历找正数:索引 1 是第一个正数,返回1+1=2(符合预期)。
示例 3:输入nums = [7,8,9,11,12]
  1. 过滤无效值:所有数 > 5,替换为 6 →[6,6,6,6,6]
  2. 标记存在的数:所有 x=6(>5)→ 不处理,数组仍为[6,6,6,6,6]
  3. 遍历找正数:索引 0 是第一个正数,返回0+1=1(符合预期)。

核心优势

  • 时间复杂度 O (n):仅三次线性遍历,无嵌套操作;
  • 空间复杂度 O (1):仅使用常数级临时变量,原地修改数组;
  • 鲁棒性:处理了负数、重复值、超大数等边界场景,适配题目 10⁵级别的数组长度。

Python代码:

from typing import List class Solution: def firstMissingPositive(self, nums: List[int]) -> int: n = len(nums) # 过滤无效值 for i in range(n): if nums[i] <= 0 or nums[i] > n: nums[i] = n + 1 # 标记存在的数 for i in range(n): x = abs(nums[i]) if x <= n: nums[x - 1] = -abs(nums[x - 1]) # 查找缺失值 for i in range(n): if nums[i] > 0: return i + 1 return n + 1 # 测试用例 if __name__ == "__main__": solution = Solution() # 示例1 nums1 = [1,2,0] print(f"示例1输入: {nums1}") print(f"示例1输出: {solution.firstMissingPositive(nums1)}") # 示例2 nums2 = [3,4,-1,1] print(f"示例2输入: {nums2}") print(f"示例2输出: {solution.firstMissingPositive(nums2)}") # 示例3 nums3 = [7,8,9,11,12] print(f"示例3输入: {nums3}") print(f"示例3输出: {solution.firstMissingPositive(nums3)}") # 边界用例:1~n都存在 nums4 = [1,2,3,4] print(f"示例4输入: {nums4}") print(f"示例4输出: {solution.firstMissingPositive(nums4)}") # 边界用例:空值/重复值 nums5 = [2,2,2] print(f"示例5输入: {nums5}") print(f"示例5输出: {solution.firstMissingPositive(nums5)}")

LeetCode提交代码:

from typing import List class Solution: def firstMissingPositive(self, nums: List[int]) -> int: n = len(nums) # 步骤1:过滤无效值(≤0 或 >n的数替换为n+1,不干扰后续标记) for i in range(n): if nums[i] <= 0 or nums[i] > n: nums[i] = n + 1 # 步骤2:标记存在的正整数(用负数标记,表示对应数存在) for i in range(n): x = abs(nums[i]) # 取绝对值,避免已标记的负数干扰 if x <= n: # 仅处理1~n范围内的数 nums[x - 1] = -abs(nums[x - 1]) # 标记为负数(重复标记不影响) # 步骤3:查找第一个未标记的位置(正数),返回i+1 for i in range(n): if nums[i] > 0: return i + 1 # 所有1~n都存在,返回n+1 return n + 1

程序运行结果如下:

示例1输入: [1, 2, 0] 示例1输出: 3 示例2输入: [3, 4, -1, 1] 示例2输出: 2 示例3输入: [7, 8, 9, 11, 12] 示例3输出: 1 示例4输入: [1, 2, 3, 4] 示例4输出: 5 示例5输入: [2, 2, 2] 示例5输出: 1

总结

本文提出了一种在O(n)时间复杂度和常数空间内寻找数组中缺失最小正整数的算法。核心思路是通过原地哈希标记:首先过滤无效值(≤0或>n的数),然后利用数组索引标记存在的正整数(1~n),最后扫描数组找到第一个未被标记的位置。该方法高效处理了各种边界情况(负数、重复值、超大数等),并通过三个线性遍历实现最优复杂度。Python实现验证了算法的正确性,适用于LeetCode等编程挑战。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 10:35:33

同一线程有两个boost::asio::io_context可以吗?

目录 1.什么是boost::asio::io_context&#xff1f; 2.核心接口详解 3.多线程使用&#xff08;核心进阶场景&#xff09; 3.1.多线程 run() 的核心特性 3.2.Strand&#xff1a;回调序列化&#xff08;解决线程安全&#xff09; 4.跨平台事件多路复用器&#xff08;核心适…

作者头像 李华
网站建设 2026/5/10 11:57:15

Z-image LoRA 训练整合包下载与使用教程(详细图文教程)

Z-image LoRA 训练整合包下载与使用教程&#xff08;详细图文教程&#xff09; 标签&#xff1a;Z-image、LoRA训练、AI绘图、AI模型训练、Z-image本地部署、LoRA微调、Stable Diffusion LoRA、Z-image整合包 最近后台有不少小伙伴问我&#xff1a;Z-image 的 LoRA 训练怎么…

作者头像 李华
网站建设 2026/5/2 19:42:03

第五十七篇-ComfyUI+V100-32G+安装SD1.5

环境 系统&#xff1a;CentOS-7 CPU : E5-2680V4 14核28线程 内存&#xff1a;DDR4 2133 32G * 2 显卡&#xff1a;Tesla V100-32G【PG503】 (水冷) 驱动: 535 CUDA: 12.2 ComfyUI:系统软件信息 系统信息 OS linux Python Version 3.12.12 | packaged by Anaconda, Inc. | (mai…

作者头像 李华
网站建设 2026/5/11 0:49:43

【异常】豆包TTS语音合成常见报错及SSML代码实现解决方案

一、报错内容 在豆包TTS语音合成使用过程中,出现以下三类典型读音错误,影响语音输出准确性: 符号读音错误:输入文本“睡眠时间7-8小时”,预期输出“睡眠时间7至8小时”,实际输出“睡眠时间7减8小时”; 多音字发音错误:输入文本“偏好”(正确读音为piān hǎo,“好”…

作者头像 李华
网站建设 2026/5/9 16:29:16

基于数据挖掘的中风智能预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 系统概述 随着医疗大数据的快速发展&#xff0c;利用机器学习技术辅助疾病诊断已成为智慧医疗的重要方向。本项目开发了一套基于数据挖掘的中风智能预测系统。该系统旨在通过分析患者的性别、年龄、生活习惯…

作者头像 李华
网站建设 2026/5/8 2:47:02

Windows右键菜单优化全攻略:告别卡顿的3大诊断与4步修复方案

Windows右键菜单优化全攻略&#xff1a;告别卡顿的3大诊断与4步修复方案 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 当点击文件后那个小圆圈不停旋转&#x…

作者头像 李华