具体思路:
原地hash问题,自己想到了一部分,但是没有想完全正确;
自己之前想的非正数和大于范围的元素置为0,从1开始搜索;
但是会在全序列无0且都在范围内出错;
假设,数组大小为n,所以针对于1~n个位置,如果都能装满,则下标填满的是0~n-1;
如果期间有0,或者不满足的元素,则必定有一个位置是空出来的;
否则返回的必定是n+1;
因此,只需要按照原地hash的方法,把0~n-1对应的不是1-n的置为负数,寻找第一个正数即可;
具体算法:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
if(nums.size()==1&&nums[0]==1)
return 2;
int max=pow(10,6);
int n=nums.size();
for(int i=0;i<nums.size();i++){
if(nums[i]<=0||nums[i]>n){
nums[i]=n+1;
}
}
for(int i=0;i<nums.size();i++){
int index=abs(nums[i]);
if(index!=n+1){
nums[index-1]=-abs(nums[index-1]);
}
}
for(int i=0;i<nums.size();i++){
if(nums[i]>0)
return i+1;
}
return n+1;
}
};