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.
swap
class Solution {
public:
int firstMissingPositive(int A[], int n) {
int i, An = 0;
for (i = 0; i < n; ++i)
while (A[i] != i)
if (A[i] >= 0 && A[i] < n && A[A[i]] != A[i])
swap(A[i], A[A[i]]);
else if (A[i] == n) {
An = n;
break;
}
else
break;
for (i = 1; i < n; ++i)
if (A[i] != i)
return i;
if (An)
return An + 1;
else
return n ? n : 1;
}
};
Here is a TLE version, find the bug:
class Solution {
public:
int firstMissingPositive(int A[], int n) {
for (int i = 1; i <= n; ++i) {
while (A[i-1] != i && A[i-1] >= 1 && A[i-1] <= n) {
swap(A[i-1], A[A[i-1]-1]);
}
}
for (int i = 1; i <= n; ++i)
if (A[i-1] != i)
return i;
return n+1;
}
};
AC Code:
class Solution {
public:
int firstMissingPositive(int A[], int n) {
for (int i = 1; i <= n; ++i) {
while (A[i-1] != i && A[i-1] >= 1 && A[i-1] <= n && A[A[i-1]-1] != A[i-1]) {
swap(A[i-1], A[A[i-1]-1]);
}
}
for (int i = 1; i <= n; ++i)
if (A[i-1] != i)
return i;
return n+1;
}
};