首先,遍历数组使值为(i+1)的数储存在第i位上:
不断交换第i位和第nums[i]-1上的数字直至第i位上的数字为无意义的数(大于数组大小的数、0和负数,这些数的出现无法使数组从1~nums.size()上为从1开始的连续整数)
然后再次遍历数组,只要在位置i上的不是(i+1),该位置即为第一个缺失的正整数。
若数组从1开始为连续正数,则答案为数组大小加一。
时间复杂度:O(N)
C++代码:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
if (nums.empty())
return 1;
for (int i = 0; i < nums.size(); i++)
{
while (nums[i] > 0 && nums[i] <= nums.size() && nums[i] != i + 1)
{
if (nums[i] == nums[nums[i] - 1])
nums[i] = -1;
else
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;
}
};