Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.
Your algorithm should run in O(n) time and uses constant space.
Seen this question in a real interview before?
// Wrong! O(n) time and O(n) space
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
size_t size = nums.size();
int ret = 1;
// the first missing positive number is in the range of 1 to size + 1
// so the index of flag is zero to size + 1
vector<int> flag(size + 2, 0);
for (size_t i = 0; i < size; ++i) {
int val = nums[i];
if (val > 0 && val <= size + 1)
flag[val] = 1;
}
for (size_t i = 1; i <= size + 1; ++i) {
if (flag[i] == 0){
ret = i;
break;
}
}
return ret;
}
}; // about 57%
参考后
// O(n) swap time, O(n)read time, o(1) space
int firstMissingPositive(vector<int>& nums) {
// when nums is empty return 1
size_t size = nums.size();
size_t flag = size;
for (size_t i = 0; i < size; ++i) {
// 当 nums[i] < 0; nums[i] > size; nums[i] == nums[nums[i] - 1] (已经排过了,重复) 时跳过
while (nums[i] != i + 1 && nums[i] >= 1 && nums[i] <= size && nums[i] != nums[nums[i] - 1]) {
swap(nums[i], nums[nums[i] - 1]);
}
}
for (size_t i = 0; i < size; ++i) {
if (nums[i] != i + 1)
return i + 1;
}
return size + 1;
}
};