class Solution {
public:
/*时间:O(n)
while 循环不会每一次都把数组里面的所有元素都看一遍。如果有一些元素在这一次的循环中被交换到了它们应该在的位置,那么在后续的遍历中,由于它们已经在正确的位置上了,代码再执行到它们的时候,就会被跳过。
最极端的一种情况是,在第 1 个位置经过这个 while 就把所有的元素都看了一遍,这个所有的元素都被放置在它们应该在的位置,那么 for 循环后面的部分的 while 的循环体都不会被执行。
平均下来,每个数只需要看一次就可以了,while 循环体被执行很多次的情况不会每次都发生。这样的复杂度分析的方法叫做均摊复杂度分析。*/
//空间o(1)
int firstMissingPositive(vector<int>& nums) {
if(nums.size() == 0) return 1;
int len = nums.size();
//将值i + 1放在位置i上,
for(int i = 0; i < len; i++) {
while(nums[i] > 0 && nums[i] <= len && nums[nums[i] - 1] != nums[i]) {
swap(nums, nums[i] - 1, i);
}
}
int i = 0;
for( ; i < len; i++) {
if(nums[i] != i + 1) {
return i + 1;
}
}
return i + 1;
}
private:
void swap(vector<int>& nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
};