public:
int firstMissingPositive(vector<int>& nums) {
//有个规律需要思考出来:这个最小数字,肯定处于1~n+1之间
//0-n-1 存储 1-n 之间的数字。
//最后来一次遍历,如果存在缺失,则缺失的即为所求;否则,n+1即为所求
//存储的过程,可以描述为:下标从0-n-1遍历数组,如果符合nums[i-1]==i,则继续,
//否则,swap(nums[i-1],nums[nums[i-1]])(遇到nums[nums[i-1]]= nums[i-1]的情况,就不需要做这个替换,继续增加索引即可);
//最终肯定能把 i 放到i-1上
int temp;
int flag = false;
for (int i = 0; i < nums.size(); i++)
{
if(nums[i] == 1){
flag = true;
}
if((nums[i]<=0 || nums[i]>nums.size())){
nums[i] = 1;
}
}
if(!flag){
return 1;
}
for (int i = 0; i < nums.size(); i++)
{
//当前元素不是i+1,且待交换的 nums[nums[i]-1] != nums[i](避免死循环)
while(nums[i]!=i+1 && nums[nums[i]-1]!=nums[i]){
temp = nums[i];
nums[i] = nums[nums[i]-1];
nums[temp-1] = temp;
}
}
int i = 0;
for (; i < nums.size(); i++)
{
if(nums[i]!=i+1){
return i+1;
}
}
return i+1;
}