給定一個未排序的整數數組,找出其中沒有出現的最小的正整數。
示例 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