算法题-缺失的第一个正数

https://leetcode.cn/problems/first-missing-positive/

假设$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;
    }
};