41.缺失的第一个正数
思路:1.题目目标是找缺失的第一位正整数indexx,也就是说indexx>=1&&indexx<=n+1。
2.希望在0(n)的时间复杂度下解决,那么我们就需要用到数组空间去换取时间。而题目要求“只使用常数级别额外空间的解决方案”,那么我们的目标就瞄准原始数组nums,在nums上进行处理,来达到要求。
3.先遍历一遍,把nums[i]<=0和nums[i]>lens的数都置为-1,表示无效的数。
4.再遍历一遍,对于nums[i]!=-1的数进行处理,详细处理流程看注释
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int lens=nums.size();
for(int i=0;i<lens;i++){
if(nums[i]<=0||nums[i]>lens) nums[i]=-1;//-1表示无效的数
}
for(int i=0;i<lens;i++){
if(nums[i]>0){
//-1的目的是因为数组nums的小标是从-1开始的,为了避免当nums[i]=lens的情况造成数组下标越界的情况发生。
int t=nums[nums[i]-1];//下标原来的值进行保存
nums[nums[i]-1]=0;//0表示该值nums[i]-1(下标)存在
while(t>0){//对下标原来的值进行处理
if(nums[t-1]!=0){//符合要求但还没标记就进行标记
int tmp=nums[t-1];
nums[t-1]=0;
t=tmp;
}else break;
}
}
}
int indexx=0;
for(int i=0;i<lens;i++){
if(nums[i]!=0){
indexx=i+1;
break;
}
}
if(indexx==0) indexx=lens+1;
return indexx;
}
};