Given an unsorted integer array, find the first missing positive integer.
For example,
Given[1,2,0]return3,
and[3,4,-1,1]return2.
Your algorithm should run in O(n) time and uses constant space.
//虽然通过 但是不是 constant space
class Solution {
public:
int firstMissingPositive(int A[], int n)
{
unordered_set<int> sset;
int res = 1;
for (int i=0;i<n;i++)
{
if (A[i] > 0)
sset.insert(A[i]);
}
while(true)
{
if (sset.find(res++) == sset.end())
return --res;
}
}
};
class Solution {
public:
int firstMissingPositive(int A[], int n)
{
for (int i=0;i<n;i++)
{
while(A[i]>0&&A[i]<=n&&A[i] != A[A[i]-1])
swap(A[i], A[A[i]-1]);
}
for (int i=0;i<n;i++)
{
if(A[i] != i + 1)
return i + 1;
}
return n+1;
}
};
测试
#include<iostream>
#include<set>
using namespace std;
class Solution {
public:
int firstMissingPositive(int A[], int n)
{
set<int> sset;
int res = 1;
for (int i=0;i<n;i++)
{
if (A[i] > 0)
sset.insert(A[i]);
}
while(true)
{
if (sset.find(res++) == sset.end())
return --res;
}
}
};
class Solution1 {
public:
int firstMissingPositive(int A[], int n)
{
for (int i = 0; i < n; ++i) {
while (A[i] > 0 && A[i] <= n && A[A[i] - 1] != A[i]) {
swap(A[i], A[A[i] - 1]);
}
}
for(int i=0;i<n;i++)
cout<<A[i]<<" ";
cout<<endl;
for (int i = 0; i < n; ++i) {
if (A[i] != i + 1) return i + 1;
}
return n + 1;
}
};
class Solution2 {
public:
int firstMissingPositive(int A[], int n)
{
for (int i=0;i<n;i++)
{
while(A[i]>0&&A[i]<=n&&A[i] != A[A[i]-1])
swap(A[i], A[A[i]-1]);
}
for (int i=0;i<n;i++)
{
if(A[i] != i + 1)
return i + 1;
}
return n+1;
}
};
int main()
{
Solution2 s;
int A[] = {3,4,-1,1,2};
cout<<s.firstMissingPositive(A, 5)<<endl;
}