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; } };