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.
11/1
近brutal-force
public class Solution {
public int firstMissingPositive(int[] A) {
// strategy: let A[i] store i+1, thus return the first i s.t. A[i] != i+1
int len = A.length;
boolean[] shown = new boolean[len+1];
for(int a:A){
if(a <= len && a>= 0){
if(!shown[a]){
shown[a] = true;
}
}
}
for(int i=1; i<=len; i++){
if(!shown[i]) return i;
}
return len+1;
}
}
比较tricky的一种解法, 特别小心err2处的错误
public class Solution {
public int firstMissingPositive(int[] A) {
// strategy: let A[i] store i+1, thus return the first i s.t. A[i] != i+1
int len = A.length;
for(int i=0; i<len; i++){
while(A[i] != i+1 && A[i] <= len && A[i] > 0 && A[i] != A[A[i]-1]){ // err1: A[i] > 0
// swap A[i] with A[A[i]-1]
int tmp = A[i];
A[i] = A[A[i]-1];
A[tmp-1] = tmp; // err2: very careful, A[i] has changed above, so use tmp in both place!
}
}
for(int i=0; i<len; i++){
if(A[i] != i+1){
return i+1;
}
}
return len+1;
}
}
classic solution:
O(1) space and O(n) for time.