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:使用空间
用一个set存储已经出现的正数,从1开始遍历到最大值,找到第一个不在的正数,如果遍历到最大值,返回最大值+1
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int mx = 0;
unordered_set<int> s;
for (int num : nums) {
if (num <= 0) continue;
s.insert(num);
mx = max(mx, num);
}
for (int i = 1; i <= mx; ++i) {
if (!s.count(i)) return i;
}
return mx + 1;
}
};
解法2:不使用空间
交换数组位置,按顺序是nums[i]在数组中的位置为nums[i]-1,所以从头开始遍历数组,当满足
nums[i] >0 && nums[i]-1 != i && nums[i]-1 < size && nums[i] != nums[nums[i]-1]时,交换。
交换完毕后再遍历一遍数组,当 nums[i]-1 != i 时,此时找到最小的丢失正数。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int size = nums.size();
for(int i=0;i<size;i++){
while(nums[i] > 0 && nums[i] -1 != i && nums[i]-1 <size && nums[i] != nums[nums[i]-1]){
swap(nums[i], nums[nums[i]-1]);
}
}
for(int i=0;i<size;i++){
if(nums[i]-1 != i)
return i+1;
}
return size+1;
}
};