news 2026/6/10 22:41:10

《缺失的第一个正数:原地哈希算法的理论与实践》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《缺失的第一个正数:原地哈希算法的理论与实践》

摘要

缺失的第一个正数问题是数组处理领域的经典算法问题,要求在未排序整数数组中找出未出现的最小正整数,同时需满足时间复杂度 O(n) 与常数级额外空间的约束。本文以 ** 原地哈希(置换法)** 为核心,系统分析其算法原理、正确性证明、复杂度特性,并对比其他方法的局限性,同时探讨工程实现中的边界处理与优化策略。实验结果表明,原地哈希法在时间效率、空间开销与代码简洁性上达到了最优平衡,适用于大规模数组场景。

1. 问题定义与背景

给定未排序整数数组 nums(元素取值范围为 [−231,231−1]),目标是找到其中未出现的最小正整数。例如:

  • 输入 nums=[1,2,0],输出为 3(1、2 已存在,最小缺失正整数为 3);
  • 输入 nums=[3,4,−1,1],输出为 2(1 存在,2 缺失);
  • 输入 nums=[7,8,9,11,12],输出为 1(最小正整数 1 未出现)。

该问题广泛应用于数据完整性校验、数据库索引缺失检测等场景,其高效解法对资源受限环境(如嵌入式系统)具有关键意义。

2. 算法核心思想:原地哈希

2.1 问题转化与观察

对于长度为 n 的数组,未出现的最小正整数必然在 [1,n+1] 范围内

  • 若数组包含 1∼n 的所有正整数,则缺失的最小正整数为 n+1;
  • 否则,缺失的最小正整数是 1∼n 中第一个未出现的数。

基于此观察,可通过原地置换将数组转化为 “索引与值匹配” 的哈希表:将值为 x(满足 1≤x≤n)的元素置换到索引 x−1 的位置,最终遍历数组找到第一个 “索引 i 对应的元素不为 i+1” 的位置,其对应的 i+1 即为答案。

3. 算法步骤与正确性证明

3.1 算法步骤

  1. 原地置换:遍历数组,对于每个元素 nums[i],若满足 1≤nums[i]≤n 且 nums[nums[i]−1]=nums[i],则将 nums[i] 与 nums[nums[i]−1] 交换,直到当前位置元素不满足置换条件;
  2. 查找缺失值:再次遍历数组,若 nums[i]=i+1,则返回 i+1;
  3. 全匹配情况:若数组所有位置均满足 nums[i]=i+1,则返回 n+1。

3.2 正确性证明

  • 置换阶段:每个满足条件的元素最终会被置换到其 “应在的位置”(即值 x 对应索引 x−1),且每个元素最多被置换 O(1) 次(置换后不会再次处理);
  • 查找阶段:第一个不匹配的位置 i 对应的 i+1 是最小缺失正整数 —— 因为 1∼i 已通过置换出现在数组中,而 i+1 未出现;
  • 全匹配情况:数组包含 1∼n,故缺失的最小正整数为 n+1。

4. 复杂度分析

4.1 时间复杂度

  • 置换阶段:每个元素最多被交换 O(1) 次(交换后会被放置到正确位置,后续不会再次处理),因此遍历数组的时间复杂度为 O(n);
  • 查找阶段:遍历数组的时间复杂度为 O(n);总时间复杂度为 O(n)。

4.2 空间复杂度

仅使用常数级额外变量(无额外数组、哈希表等结构),空间复杂度为 O(1)。

5. 工程实现与边界处理

class Solution { public: int firstMissingPositive(vector<int>& nums) { int n = nums.size(); // 原地置换:将x放到x-1的位置 for (int i = 0; i < n; ++i) { while (nums[i] >= 1 && nums[i] <= n && nums[nums[i]-1] != nums[i]) { swap(nums[i], nums[nums[i]-1]); } } // 查找第一个不匹配的位置 for (int i = 0; i < n; ++i) { if (nums[i] != i + 1) { return i + 1; } } // 所有1~n都存在,返回n+1 return n + 1; } };

5.2 边界情况处理

  • 数组为空:返回 1(最小正整数);
  • 元素为负数 / 0 / 大于 n:跳过置换(这些值不影响 1∼n 的匹配);
  • 元素重复:通过nums[nums[i]-1] != nums[i]避免无限循环(重复元素无需多次置换)。

6. 与其他方法的对比

方法时间复杂度空间复杂度核心优势局限性
原地哈希法O(n)O(1)时间 / 空间最优,无额外依赖需修改原数组
哈希表法O(n)O(n)逻辑直观,不修改原数组空间复杂度不满足要求
排序法O(nlogn)O(1)实现简单时间复杂度不满足要求

7. 结论与扩展

原地哈希法是解决 “缺失的第一个正数” 问题的最优解法,其通过 “值与索引的映射” 实现了原地排序,在严格满足 O(n) 时间与 O(1) 空间约束的同时,保证了算法的正确性与高效性。

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

11、Linux 中 Samba 共享目录与打印机的配置指南

Linux 中 Samba 共享目录与打印机的配置指南 1. 引言 在 Linux 系统中,Samba 是一个强大的工具,可用于在 Windows 网络中实现文件和打印机共享。它能让 Linux 计算机作为客户端、服务器或域控制器,与 Windows 网络进行交互。接下来,我们将详细探讨如何通过 Samba 的配置文…

作者头像 李华
网站建设 2026/6/10 18:03:49

18、Windows工作站网络连接全攻略

Windows工作站网络连接全攻略 在网络环境搭建中,不同版本Windows工作站的连接配置是一项重要工作。下面将详细介绍Windows ME、Windows NT 4 Workstation和Windows 2000 Professional等系统的网络连接、共享设置及漫游配置等内容。 Windows ME系统网络连接与共享设置 网络连…

作者头像 李华
网站建设 2026/6/10 5:27:45

Hadoop在大数据领域的日志分析实践

Hadoop在大数据领域的日志分析实践 关键词&#xff1a;Hadoop、大数据、日志分析、MapReduce、HDFS、Hive、Spark 摘要&#xff1a;本文系统解析Hadoop在大数据日志分析中的核心技术与实践方案。从Hadoop生态架构出发&#xff0c;结合MapReduce分布式计算模型与HDFS分布式存储系…

作者头像 李华
网站建设 2026/6/10 19:40:54

《中国城市统计年鉴》面板数据(1985-2024)

1815《中国城市统计年鉴》面板数据&#xff08;1985-2024&#xff09;数据简介《中国城市统计年鉴》是国家统计局城市社会经济调查司主办的、全面反映中国城市经济和社会发展情况的资料性年刊。从1985年开始&#xff0c;每年12月国家统计局城市社会经济调查司会收录并出版发布全…

作者头像 李华
网站建设 2026/6/10 16:17:53

登贝莱创历史 成 90 后首位世界足球先生

2025年国际足联年度颁奖典礼在卡塔尔多哈隆重举行。最大的悬念终于揭晓&#xff1a;巴黎圣日耳曼前锋奥斯曼登贝莱&#xff0c;力压一众巨星&#xff0c;成功当选2025年FIFA年度最佳男足球员&#xff08;世界足球先生&#xff09;&#xff01;这意味着&#xff0c;他在同年包揽…

作者头像 李华
网站建设 2026/6/10 14:58:33

GESP认证C++编程真题解析 | B3864 [GESP202309 一级] 小明的幸运数

​欢迎大家订阅我的专栏&#xff1a;算法题解&#xff1a;C与Python实现&#xff01; 本专栏旨在帮助大家从基础到进阶 &#xff0c;逐步提升编程能力&#xff0c;助力信息学竞赛备战&#xff01; 专栏特色 1.经典算法练习&#xff1a;根据信息学竞赛大纲&#xff0c;精心挑选…

作者头像 李华