1.检查有没有1
2.记数组长度为n,把所有大于n和小于1的数去掉。具体操作:把所有小于1的数变成1
3.从左往右遍历数组,如果数字a大于n,略过,否则就把数组第a-1个元素变成负的。
4.从左往右遍历数组,找到第一个正数,对应下标+1就是答案了。
其实就是用正负号代表数字有没有出现过,这样就不用额外空间了。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
bool f= false;
for(int i=0;i<nums.size();++i){
if(!f && nums[i]==1) f=true;
if(nums[i]<=0) nums[i] = 1;
}
if(!f) return 1;
for(int i=0;i<nums.size();++i){
int k = abs(nums[i]);
if(k<=n) {
if(nums[k-1]>0) nums[k-1] = -nums[k-1];
}
}
for(int i=0;i<nums.size();++i){
if(nums[i]>0) return i+1;
}
return n+1;
}
};