class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int size = nums.size();
if(size <=0) return 1;
/*巧妙之处在这里,看似双重循环,其实只遍历了一遍数组,因为在内层交换过后,存在一部分i==a[i],当外层遍历到该元素,就不会进入循环内,相当于只遍历了一遍数组。*/
for(int i=0;i<size;i++){
//这里就是做简单交换,把大小为i的放到index=i的位置
//因为size只有n,index=n-1,,那自然是0~n-1之间的数才能放到对应的位置
//对于0就不管了;
//当index为i的数nums【ℹ️】!=i时候,那就把当前nums【i】的数交换到正确的index位置即可;然后在当前i的位置while循环,不断交换;当两个要交换的位置数相等的时候说吗交换不了了,然后就结束这次的循环,去下一个位置找
while(nums[i]>0&&nums[i]<size&&(i!=nums[i])){
int t = nums[i];
if(nums[t]==nums[i]) break;
int tmp = nums[i];
nums[i]=nums[t];
nums[t] = tmp;
}
}
//找的是正整数,所以从下标为1的进行找即可,下标i就是我们要返回的结果。
for(int i =1;i<size;i++){
if(i!=nums[i])return i;
}
//没找到的话,可能是n+1;或者是n本身。
//因为我没找到那必然不在0~n-1范围内,说说明至少是n;但是位置为0的那个我们没有便利,所以可能是n,那就得n+1了
return size+(nums[0]==(size));
}
};
https://blog.csdn.net/weixin_40846513/article/details/81212587?spm=1001.2014.3001.5506