原地哈希

(1)答案肯定在[1, n + 1]之间;
(2)通过原地哈希,将[1, n]的元素对应回数组的[0, n - 1]位置上;
时间复杂度:
空间复杂度:

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();
        for(int i = 0; i < n; i ++){
            //在整个外部for循环下,while的swap交换总次数最多为n次,所以时间复杂度为外部for循环的时间复杂度
            while(nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]){ //没有在合适的位置
                swap(nums[i], nums[nums[i] - 1]);
            }
        }
        for(int i = 0; i < n; i ++){
            if(nums[i] != i + 1) return i + 1;
        }
        return n + 1;
    }
};