1. 问题背景与核心挑战
在算法面试和实际数据处理中,寻找缺失的第一个正数(First Missing Positive)是一个经典问题。题目要求:给定一个未排序的整数数组,找出其中没有出现的最小的正整数。例如,对于数组 [3,4,-1,1],缺失的第一个正数是2;而对于 [7,8,9,11,12],结果则是1。
这个问题的难点在于:
- 时间复杂度要求通常为O(n)
- 空间复杂度要求通常为O(1)
- 需要处理包含非正数和重复值的特殊情况
- 数组可能本身包含所有连续正数(如[1,2,3]应返回4)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 常规解法与局限性
2.1 哈希表法(非原地)
最直观的解法是使用哈希表记录出现的数字,然后从1开始检查第一个未出现的正数。这种方法虽然时间复杂度为O(n),但需要额外的O(n)空间,不符合原地操作的要求。
python复制def firstMissingPositive(nums):
num_set = set(nums)
for i in range(1, len(nums)+2):
if i not in num_set:
return i
2.2 排序法
先排序再扫描,时间复杂度为O(nlogn),也不满足O(n)的要求。
3. 原地哈希算法详解
3.1 核心思想
原地哈希的巧妙之处在于利用数组本身作为哈希表,通过元素交换将每个正整数放到其值对应的索引位置上(即让数字i出现在索引i-1的位置)。完成这个"座位安排"后,第一个"位置与值不匹配"的索引就是我们要找的缺失正数。
3.2 算法步骤
- 遍历数组,对于每个元素nums[i]:
- 如果它是正整数且在数组长度范围内(1 ≤ nums[i] ≤ n)
- 且它不在正确的位置上(nums[i] ≠ nums[nums[i]-1])
- 则将其交换到正确位置
- 再次遍历数组,找到第一个满足nums[i] ≠ i+1的位置
- 如果全部匹配,则返回n+1
3.3 完整实现
python复制def firstMissingPositive(nums):
n = len(nums)
for i in range(n):
