给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:输入: [1,2,0] 输出: 3
示例 2:输入: [3,4,-1,1] 输出: 2
示例 3:输入: [7,8,9,11,12] 输出: 1
说明: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
解法一:空间复杂度是O(n)
#if 1
class Solution {
public:
int firstMissingPositive(vector<int>& nums)
{
int num = nums.size();
//如果nums是空数组则返回最小的正整数1
if(num <= 0)
{
return 1;
}
auto it = nums.begin();
vector<int> vec(num, 0);
//遍历一边数组把 >= 1 并且 <= 数组长度的数字 存放在vec下标值减一的位置上
while(it != nums.end())
{
if(*it >= 1 && *it <= num)
vec[*it-1] = *it;
it++;
}
//遍历vec数组找到第一个下标+1和元素不对应的,找到后返回该下标值加1,没找到则返回数组size+1
for(int i = 0; i < num; i++)
{
if(vec[i] != i+1)
return i+1;
}
return num+1;
}
};
#endif
解法二:在解法一基础上优化了时间复杂度
#if 1
class Solution {
public:
void swap(int &num1, int &num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
int firstMissingPositive(vector<int>& nums)
{
const int num = nums.size();
if(num <= 0)
return 1;
for(int i = 0; i < num; i++)
{
while(nums[i] >= 1 && nums[i] <= num && nums[i] != nums[nums[i] - 1] && nums[i] != i+1)
swap(nums[i], nums[nums[i] - 1]);
}
int i = 0;
for(; i < num; i++)
{
if(nums[i] != i+1)
break;
}
return i+1;
}
};
#endif