Note:
先把所有的数减一,把正整数映射成和数组下标一样从0开始,然后把每个合法的数字交换到跟下标一样的位置
之后遍历一遍,看看哪个位置的数和下标不对应,就是缺失的第一个正数了
代码如下:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for(int i = 0; i < nums.size(); i ++)
if(nums[i] != INT_MIN)
nums[i] --;
for(int i = 0; i < n; i ++){
while(nums[i] >= 0 && nums[i] < n && nums[i] != i && nums[i] != nums[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;
}
};