思路
nums中有n个数,若nums中依次为1-n,则缺失的数为n+1,若其中有重复或者负数,那么这个缺失的数必在1-n中。则可以用nums这个数组作为哈希地址,由于存在重复数字,我们可以每次取nums[i]的绝对值,然后将其对应的nums的角标位置变成负数,最后遍历nums,找到第一个正数,其下标则为缺失值。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n=nums.size();
for(int &num:nums){
if(num<=0)num=n+1;
}
for(int i=0;i<n;i++){
int k=abs(nums[i]);
if(k<=n)nums[k-1]=-abs(nums[k-1]);
}
for(int i=0;i<n;i++){
if(nums[i]>0)return i+1;
}
return n+1;
}
};