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.
The simple idea is to use array's index to sort, placing the number to the correspond index slot.
My mistake solution is made because I think there is no duplicates. So, I made: nums[i] != (i + 1);
for i from 0 to size
if nums[i] != nums[nums[i] - 1] --> need swap.
I first made a mistake:
#include <vector>
#include <iostream>
using namespace std;
// This code can't pass the following test case
[1, 1]
int firstMissingPositive(vector<int>& nums) {
if(nums.size() == 0) return 0;
int i = 0;
while(i < nums.size()) {
if(nums[i] > 0 && nums[i] <= nums.size() && nums[i] != (i + 1)) // here i + 1 is wrong! This will end into infinite loop
swap(nums[nums[i] - 1], nums[i]);
else i++;
}
for(i = 0; i < nums.size(); ++i) {
if(nums[i] != (i + 1)) return i + 1;
}
return i + 1;
}
int main(void) {
vector<int> nums{1, 1};
int missing = firstMissingPositive(nums);
cout << missing << endl;
}
Correct Solution.
#include <vector>
#include <iostream>
using namespace std;
int firstMissingPositive(vector<int>& nums) {
if(nums.size() == 0) return 0;
int i = 0;
while(i < nums.size()) {
if(nums[i] > 0 && nums[i] <= nums.size() && nums[i] != nums[nums[i] - 1])
swap(nums[nums[i] - 1], nums[i]);
else i++;
}
for(i = 0; i < nums.size(); ++i) {
if(nums[i] != (i + 1)) return i + 1;
}
return i + 1;
}
int main(void) {
vector<int> nums{1, 1};
int missing = firstMissingPositive(nums);
cout << missing << endl;
}
本文介绍了一种在未排序整数数组中查找首个缺失正整数的算法,并提供了一个具体的解决方案,该方案能在O(n)时间内运行且使用常量空间。文章通过对比错误实现与正确实现,展示了如何有效地利用数组索引进行排序并找到缺失值。
893

被折叠的 条评论
为什么被折叠?



