解法一
如果全为正数,例如: , 此时可以通过打标记的方法,将已经出现的正数所在的位置变成负数,比如:,可以看出,第一个正数 所在的位置即为答案。
如果存在负数,则可以将其变为任意大于 的数,可以通过规约证明,与全为正数的解法相同
时间复杂度 ,空间复杂度
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size(), ans = n + 1;
for(auto &it: nums) {
if(it <= 0 or it > n) it = n + 1;
}
for(int i = 0; i < n; i ++) {
int x = abs(nums[i]);
if(x == n + 1) continue;
nums[x - 1] = -abs(nums[x - 1]);
}
for(int i = 0; i < n; i ++) {
if(nums[i] > 0) {
ans = i + 1;
break;
}
}
return ans;
}
};