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.
3 标准解
3.1 分析
在给定的整数数组中找到最小的未出现的正整数。要求不适用额外空间。
如果使用额外空间,可以使用hashmap,这里考虑把用该数组实现一个hashmap。对于长度为n的数组,最小的未出现的正整数不超过n+1。考虑用第i个位置上元素的符号表示正整数i+1是否出现过。
首先遍历数组,把非正整数全部赋值为1,同时确保1在原数组中出现过,否则直接返回1。此时所有元素的符号都为正。
然后再次遍历数组,如果正整数k(k<=n)出现,则把位置k-1上的元素改为负数,但绝对值不变。
最后再次遍历数组,找到第一个正数,对应的位置i+1即为所求。
3.2 代码
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
bool start = false;
for(auto&n : nums){
if(n == 1)
start = true;
n = (n <= 0? 1:n);
}
if(!start) return 1;
for(auto&n : nums){
int val = abs(n);
if(val <= nums.size())
nums[val-1] = -abs(nums[val-1]);
}
int result = 0;
for(;result<nums.size();result++)
if(nums[result] > 0)
return result+1;
return result+1;
}
};