题目
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.
思路
假设输入数组长度为N,那么最多能表示1-N的数,缺失的第一个数显然在1-N+1的范围之内。
显然这就是一个标记问题,在原来的数组上标记出1-N的值是否已经出现,没有出现的数就是缺失的第一个数,如果都出现了,缺失的就是N+1.
这道题唯一难点是负数也会出现在输入中,不能直接用正负号来表示该位置对应的数是否出现过。我的解决方案就是先遍历一遍把所有小于等于零的值都改成N+1,这样就可以直接套用之前的方法了。
代码
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int len = nums.size();
int i, pos;
if(len == 0)
return 1;
for(i = 0; i < len; i++){
if(nums[i] <= 0)
nums[i] = len+1;
}
for(i = 0; i < len; i++){
pos = abs(nums[i])-1;
if(pos < 0 || pos >= len)
continue;
if(nums[pos] > 0)
nums[pos] *= -1;
}
pos = 0;
while(pos < len && nums[pos] <= 0)
pos++;
return pos+1;
}
};
感想
提交以后看了答案,答案里写得都是什么啊,完全不符合要求,0ms的答案如下
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int len = nums.size();
vector<int> sorted(len+1);
int result = len + 1;
for (int i=0; i<len; i++) {
if (nums[i] > 0 && nums[i] <= len) {
sorted[nums[i]] = 1;
}
}
for (int i=1; i<sorted.size(); i++) {
if (sorted[i]) continue;
result = i;
break;
}
return result;
}
};
static const auto __ = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
这难道不是O(N)的空间复杂度吗?说好的constant extra space呢?