1. 问题背景与核心挑战
这道题目来自力扣热门100题榜单,编号第12题。题目要求找出一个未排序整数数组中缺失的最小正整数。初看简单,实则暗藏玄机——题目要求时间复杂度O(n)且只能使用常数级别额外空间,这直接排除了常规的排序或哈希表解法。
我在第一次遇到这个问题时,尝试用快速排序后遍历查找,结果发现O(nlogn)时间复杂度不达标。改用哈希表存储虽然能降到O(n)时间,但空间复杂度又超标了。这道题的巧妙之处在于,它迫使你必须在原数组上进行操作,通过元素交换和标记来实现线性时间的查找。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法核心思想解析
2.1 桶排序思想的应用
这个算法的精妙之处在于利用了"数组下标本身作为哈希键"的思想。对于一个长度为n的数组,缺失的最小正整数只可能在1到n+1这个范围内。因为如果1到n都出现了,那么答案就是n+1;否则答案就是第一个没出现的正整数。
具体实现时,我们遍历数组,将每个正整数x放到它应该在的位置x-1上。例如数字3应该放在索引2的位置。完成这个"归位"操作后,再次遍历数组,第一个位置不正确的索引i对应的i+1就是我们要找的答案。
2.2 关键步骤实现细节
实现时需要注意几个边界条件:
- 对于负数或大于n的数,我们可以直接忽略
- 交换元素时要确保不会陷入无限循环
- 需要检查交换后的新元素是否也需要移动
这里给出Python实现的关键代码段:
python复制def firstMissingPositive(nums):
n = len(nums)
for i in range(n):
while 1 <= nums[i] <= n and nums[nums[i]-1] != nums[i]:
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
for i in range(n):
if nums[i] != i+1:
return i+1
return n+1
3. 时间复杂度分析与优化
3.1 为什么是O(n)时间复杂度
虽然代码中有嵌套循环,但每个元素最多被交换一次就会到达正确位置。因
