核心思路
对于长度为 n 的数组,缺失的最小正整数只可能在 [1, n+1] 范围内:
- 如果
1到n都出现了,那么答案就是n+1; - 否则,答案就是其中缺失的最小正整数。
为了满足 O(n) 时间复杂度 和 O(1) 空间复杂度 的要求,我们可以利用数组本身作为'哈希表',将每个数 x(满足 1 ≤ x ≤ n)放到它对应的索引位置 x-1 处。最后遍历数组,第一个不满足 nums[i] == i+1 的位置 i+1 就是答案。
解题步骤
- 原地置换:遍历数组,对于每个元素
nums[i],如果它是1到n之间的数,并且不在正确的位置(nums[i] != nums[nums[i]-1]),就将它交换到nums[i]-1的位置。 - 查找缺失:再次遍历数组,找到第一个位置
i,使得nums[i] != i+1,返回i+1。如果所有位置都满足,返回n+1。
Java 实现
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for (int i = 0; i < n; i++) {
// 将 1~n 的数放到对应的位置
while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
int temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
}
}
// 查找第一个缺失的正整数
for (int i = 0; i < n; i++) {
(nums[i] != i + ) {
i + ;
}
}
n + ;
}


