题目大意:在给出的数组中找出第一个漏掉的正数,比如3 4 -1 1,答案为2,要求时间复杂度为O(n),空间复杂度为O(1)
分析:第一次遍历将每个位置的数字交换到它应该在的位置,直到这个位置的数字没有合适的位置,第二次遍历找到第一个位置不对的数字即可。
代码:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for (int i = 0;i < n;i++) {
//位置错误且应该放的位置在数组范围内
//最后一个条件是防止数据相等死循环
while (nums[i] > 0 && nums[i] <= n && nums[i] != i + 1
&& nums[i] != nums[nums[i] - 1]) swap(nums[i], nums[nums[i] - 1]);
}
for (int i = 0;i < n;i++) {
if (nums[i] != i + 1) return i + 1;
}
return n + 1; //如果n个正数都存在,那么就要返回n+1作为最小缺失正数
}
};