假设$n$是nums
数组的大小.
首先, 没有出现过的最小的正整数一定在$[0, n]$范围内.
然后, 我可以把数组中的元素进行归位, 使得nums[i] = i
, 那么如果数组中存在一个位置k
, 使得nums[k] != k
, 那么这个k
就是缺失的第一个整数.
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
/* 注意要实际修改数组中的元素要加引用 */
/* 这里减是为了把nums[i]映射到下标 */
/* 边界情况, 如果x是INT_MIN, 那么不能减 */
for (auto &x : nums)
if (x != INT_MIN) x --;
for (int i = 0; i < n; i ++) {
while (nums[i] >= 0 && nums[i] < n && nums[nums[i]] != nums[i])
swap(nums[i], nums[nums[i]]);
}
for (int i = 0; i < n; i ++)
if (nums[i] != i) return i + 1;
return n + 1;
}
};