借用原数组,使原数组尽量变成nums[i]=i+1的形式
如果遇到重复元素,则把其中一个变成0【不能构成的形式】
保证遍历到k位置nums{0…k}要么是nums[i]=i+1,要么nums[i]不存在对应的形式
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for(int i=0;i<nums.size();++i)
while (nums[i] != i+1 && nums[i] <= nums.size() && nums[i]>0) {
//要么形成了这个形式,要么这个位置的数不能移到其他位置
if (nums[nums[i]-1] == nums[i]) { nums[i] = 0; break; }
swap(nums[i], nums[nums[i]-1]);
}
for (int i = 0; i < nums.size(); ++i)
if (nums[i] != i+1) return i + 1;
return nums.size() + 1;
}
};