方法一 利用set 空间(O(n)) 时间 (O(n))
利用一个set存储映射关系, 然后直接从1 - size遍历找出第一个不在set中的元素就可以
int firstMissingPositive(vector<int>& nums) {
set<int> s;
for (int i = 0; i < nums.size(); ++i)
{
s.insert(nums[i]);
}
for (int i = 1; i <= nums.size() + 1; ++i)
{
if(!s.count(i)) return i;
}
return 1;
}
方法二 交换 空间(O(1)) 时间 (O(n))
直接在数组本身上操作, 空间只有交换时的临时tmp
通过交换使满足nums[i] = i + 1的元素归位
然后从头开始寻找第一个不满足的元素就是所求 , 如果全部满足, 就输出size+1
int firstMissingPositive(vector<int>& nums) {
for (int i = 0; i < nums.size(); ++i) {
while (nums[i] >= 1 && nums[i] <= nums.size() && nums[i] != nums[nums[i] - 1]) {
swap(nums[i], nums[nums[i] - 1]);
}
}
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] != i + 1) return (i + 1);
}
return nums.size() + 1;
}