将数组中所有小于等于0的数都置为 N + 1, 遍历数组,将此时将 nums[i] - 1 的下标对应的值变为负数,那么从前往后遍历到的第一个正数的下标,便是缺失的第一个正数。
如果数组的数都是负数,说明数组中出现的正数恰好是 1 - N, 那么N + 1 便是我们需要找的数
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for(auto& num : nums){
if(num <= 0){
num = n + 1;
}
}
for(int i = 0; i < n; i++){
if(abs(nums[i]) <= n){
nums[abs(nums[i]) - 1] = - abs(nums[abs(nums[i]) - 1]);
}
}
for(int i = 0; i < n; i++){
if(nums[i] > 0){
return i + 1;
}
}
return n + 1;
}
};