个人思路总结:
本题要求时间复杂度为O(n),且只能使用常数级别的空间。因此不能先对数组进行排序。
遍历一次数组把大于等于1的和小于数组大小的值放到原数组对应位置,然后再遍历一次数组查当前下标是否和值对应,如果不对应那这个下标就是答案,否则遍历完都没出现那么答案就是数组长度加1。
代码如下:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int len = nums.size();
int tmp = 0;
for(int i=0;i<len;i++)
{
while(nums[i]!=i+1)
{
if(nums[i]>0 && nums[i]<=len && nums[i]!=nums[nums[i]-1])
{
tmp = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = tmp;
}
else
break;
}
}
for(int i=0;i<len;i++)
{
if(nums[i]!=i+1)
return i+1;
}
return len+1;
}
};