查阅更多的题解,请点击
Problem
41. First Missing Positive(Hard)
Given an unsorted integer array, find the smallest missing positive integer.
Example 1:
Input: [1,2,0]
Output: 3
Example 2:
Input: [3,4,-1,1]
Output: 2
Example 3:
Input: [7,8,9,11,12]
Output: 1
Note:
Your algorithm should run in O(n) time and uses constant extra space.
Solution
题目主要抓住两点信息,即可得出解法:
- 所求firstMissingPositive一定在闭区间[1,n+1],有该观察,可以得到O(n) time, O(n) space的解法
- 可以用输入数组nums来保存元素的访问情况,则可以将O(n) space的方法优化到O(1) space
O(n) time, O(n) space
class Solution
{
public:
int firstMissingPositive(vector<int> &nums)
{
if (nums.empty())
return 1;
int n = nums.size(), res = 0;
vector<bool> visited(n + 2, false);
for (auto num : nums)
{
if (num <= n && num > 0)
{
visited[num] = true;
}
}
for (int i = 1; i <= n + 1; ++i)
{
if (!visited[i])
{
res = i;
break;
}
}
return res;
}
};
O(n) time, O(1) space
class Solution
{
public:
int firstMissingPositive(vector<int> &nums)
{
if (nums.empty())
return 1;
int n = nums.size();
int res = n + 1;
for (int i = 0; i < n; ++i)
{
while (nums[i] <= n && nums[i] > 0 && nums[i] != nums[nums[i] - 1])
{
swap(nums[i], nums[nums[i] - 1]);
}
}
for (int i = 0; i < n; ++i)
{
if (nums[i] != i + 1)
{
res = i + 1;
break;
}
}
return res;
}
};