思路:题目要求时间复杂度为O(n),空间复杂度为常数。
开始的思路为先对数组进行排序,再查找第一个丢失的整数,但排序的平均时间复杂度最小为nlogn,不能满足题目要求。
可以让数组下标作为标记,在num[i]中存放值为i+1的元素,把数字放在对应的下标下,利用已有的空间,进行交换,这样进行一次循环后正整数i就换到了i-1对应的元素中(特殊情况:数组为空、值为负、丢失的最小正数为num.size()+1);
再进行一次循环查找第一个丢失的正整数。
时间复杂度为O(2n)=O(n)。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
if(nums.size() == 0)
return 1;
for(int i = 0; i < nums.size(); ++i){
while(nums[i] > 0 && nums[i] < i+1 && nums[i] != nums[nums[i]-1]){
int temp = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = temp;
}
}
for(int i =0; i < nums.size(); ++i){
if(nums[i] != i+1)
return i+1;
}
return nums.size()+1;
}
};