1.使用map
记录大于1的数字的出现情况
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int len=nums.size();
map<int,int> m;
for(int i=0;i<len;i++)
if(nums[i]>0)
m[nums[i]]++;
auto iter=m.begin();
int val=0;
while(iter!=m.end())
{
if(iter->first>1&&iter==m.begin())//第一个元素大于1(包括只有一个元素且大于1的情况)
return 1;
val=iter->first;
iter++;
if(iter!=m.begin()&&iter->first>val+1)//说明相邻元素差值大于1
return val+1;
}
return val+1;//这种情况下val保存了最后一个元素的值
}
};
空间复杂度O(n),不符合题意
2.另一种解法
遍历数组,将元素值大于1,且小于数组长度的值放在对应位置,然后遍历数组,查看下标和元素的值是否一样,否则,下标就是缺失的值;若遍历完,则缺失的是数组长度+1
代码如下:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int len=nums.size();
for(int i=0;i<len;i++)
{
while(nums[i]>0&&nums[i]<=len&&nums[i]!=nums[nums[i]-1])//直到nums[i]放的是正确的值,或越界
swap(nums[i],nums[nums[i]-1]);
}
int i=0;
while(i<len)
{
if(nums[i]!=i+1)
return i+1;
i++;
}
return len+1;
}
};