Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.
Your algorithm should run in O(n) time and uses constant space.
给定一个无序的整型数组,找到数组中第一个未出现的正整数。
要求算法的时间复杂度为O(n),空间复杂度为O(1)。
如果没有要求空间复杂度的话,这道题只需要利用unorder_map并遍历两次即可获得结果。
#include <unordered_map>
#include "FirstMissingPositive.h"
int FirstMissingPositive::firstMissingPositive1(vector<int>& nums)
{
unordered_map<int, bool> map;
for (int i = 0; i < nums.size(); i++)
{
map[nums[i]] = true;
}
int k = 1;
for (; k <= nums.size(); k++)
{
if (map.find(k) == map.end())
return k;
}
return k;
}
int FirstMissingPositive::firstMissingPositive2(vector<int>& nums)
{
for (int i = 0; i < nums.size(); i++)
{
//這裡要達到的效果是 nums[i] != nums[nums[i] - 1],即每個位置上的值為其序列值(如果有的話)
//前兩個判斷是為了只處理正整數
while (nums[i] > 0 && 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;
}