41. 缺失的第一个正数

41. 缺失的第一个正数

给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

好歹是道困难题,但是实际上解法非常巧妙,而且很好理解。

我们已知的最小正数是1,那我们先遍历数组看看有没有1,没有的话直接返回1;

如果数组中有1,那我们就不防把非正数和大于n的数置为1,因为这些数都是不可能成为答案的;

最后我们从头遍历数组,遇到|nums[i] | 就令下标为|nums[i] |的数为负,其中下标0用来保存n是否出现;

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n=nums.size();
        bool flag=false;
        for(int i=0;i<n;i++){
            if(nums[i]==1){flag=true;}
            else if(nums[i]<=0)nums[i]=1;
            else if(nums[i]>n)nums[i]=1;
        }
        if(!flag)return 1;
        for(int i=0;i<n;i++){
            int k=abs(nums[i]);
            if(k==n){
                if(nums[0]>0)
                    nums[0]*=-1;
                continue;
            }
            if(nums[k]>0)nums[k]*=-1;
        }
        for(int i=1;i<n;i++){
            if(nums[i]>0){
                return i;
            }
        }
        if(nums[0]>0)return n;
        return n+1;
    }
};
原文地址:https://www.cnblogs.com/Dancing-Fairy/p/12817339.html