题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目解析
法一:
我们可以直接将数组中的数放到哈希表中,然后遍历[1,n],n为数组的大小,当遍历到某个数没有出现过的时候,就返回,若遍历完毕也没有,则返回n+1。
法二:
1、将负数转换为n+1
2、将在[1,n]的数转化为负数并且赋值到该数组对应数-1的下标位置
注意:切记切记我们在进行第二步的时候需要注意的是,遍历的这个位置
很可能之前已经被标记了,也就是已经被赋值为负数了,因此我们需要检测的是
它的绝对值是否符合条件,然后再使用该值进行进行进一步的赋值给对应绝对值数-1
的下标位置
3、返回数组中第一个不为负数的数+1
代码
法一
class Solution
{
public:
int firstMissingPositive(vector<int>& nums)
{
unordered_map<int,int> hash;
for(auto&e:nums) hash[e]++;
for(int i=1;i<=nums.size();i++)
{
if(hash[i]==0) return i;
}
return nums.size()+1;
}
};
法二
class Solution
{
public:
int firstMissingPositive(vector<int>& nums)
{
int n=nums.size();
// 1、将负数转换为n+1
// 2、将在[1,n]的数转化为负数并且赋值到该数组对应数-1的下标位置
// 注意:切记切记我们在进行第二步的时候需要注意的是,遍历的这个位置
// 很可能之前已经被标记了,也就是已经被赋值为负数了,因此我们需要检测的是
// 它的绝对值是否符合条件,然后再使用该值进行进行进一步的赋值给对应绝对值数-1
// 的下标位置
// 3、返回数组中第一个不为负数的数+1
for(int&in:nums)
{
if(in<=0) in=n+1;
}
for(int i=0;i<n;i++)
{
int num=abs(nums[i]);
if(num<=n)
{
int k=num-1;
nums[k]=-abs(nums[k]);
}
}
for(int i=0;i<n;i++)
{
if(nums[i]>0) return i+1;
}
return n+1;
}
};