

核心思路
对于长度为 n 的数组,缺失的最小正整数只可能在 [1, n+1] 范围内。如果 1 到 n 都出现了,答案就是 n+1;否则,答案就是其中缺失的最小正整数。
为了满足 O(n) 时间复杂度 和 O(1) 空间复杂度 的要求,我们可以利用数组本身作为'哈希表'。将每个数 x(满足 1 ≤ x ≤ n)放到它对应的索引位置 x-1 处。最后遍历数组,第一个不满足 nums[i] == i+1 的位置 i+1 就是答案。
方法一:原地置换(Cyclic Sort)
这是一种直观的思路。我们遍历数组,对于每个元素 nums[i],如果它是 1 到 n 之间的数,并且不在正确的位置(即 nums[i] != nums[nums[i]-1]),就把它交换到 nums[i]-1 的位置。重复这个过程直到当前元素归位或超出范围。
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;
}
}
( ; i < n; i++) {
(nums[i] != i + ) {
i + ;
}
}
n + ;
}





