41. First Missing Positive
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.
方法1:
Complexity
Time complexity: O(n)
Space complexity: O(n), although INT_MAX as the max, which could mean O(1)
思路:
创建一个以nums.size() 为长度的bool数组, 如果该数字出现,mark为true,最后遍历以便找到第一个为false的正整数
方法2:
basketking: https://www.youtube.com/watch?v=8DqewGsVNkI
思路:
首先注意到,我们可以忽略input中所有的0,负数和大于等于n的数。0和负数不影响结果,而我们的结果最大可能值是n。
对每一个遇到的正整数,将其所在的数字标记为负数,这样我们就把出现与否换成了符号的形式储存而不用覆盖原位数字。第二遍遍历找到第一个没有被反转过的数字即可。
易错点
- 0 也需要 变为max
- 这个答案还没过
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
if (nums.size() == 0) return 1;
for (int i = 0; i < nums.size(); i++){
if (nums[i] <= 0){
nums[i] = INT_MAX;
}
}
for (int i = 0; i < nums.size() ; i++){
int num = abs(nums[i]);
if (num < nums.size()){
nums[num - 1] = - abs(nums[num - 1]);
}
}
for (int i = 0; i < nums.size(); i++){
if (nums[i] > 0 && nums[i] < nums.size()){
return i + 1;
}
}
return nums.size();
}
};
方法2:
discussion: https://leetcode.com/problems/first-missing-positive/discuss/17071/My-short-c%2B%2B-solution-O(1)-space-and-O(n)-time
思路:
Put each number in its right place.
For example:
When we find 5, then swap it with A[4].
At last, the first place where its number is not right, return the place + 1.
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
//if (nums.size() == 0) return 1;
int n = nums.size();
for (int i = 0; i < n; i ++){
while (nums[i] <=n && nums[i] > 0 && nums[nums[i] - 1] != nums[i]){
swap(nums[i], nums[nums[i] - 1]);
}
}
for (int i = 0; i< n; i++){
if (nums[i] != i + 1){
return i + 1;
}
}
return n + 1;
}
};