题目:
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.
解法:这题要求查找数组中缺少的最小正整数,而且只能在线性时间内和常数空间内完成,所以不能用HashSet!
参考别人的解决思路,第一遍遍历数组,使得下标为i的数组元素的值为i+1,或者说让数组中的所有正整数k,都在下标为k-1的位置!第二遍只要检查第一个出现A[k-1]!=k的k就可以了。
那么问题就是怎么让正整数k放在A[k-1]中:
首先我们遍历数组,如果数组元素A[i]大于0,那么我们需要将它放在A[A[i]-1],当然还需要检查
1、是否需要移动;如果A[i]已经等于i+1或者A[A[i]-1]已经等于A[i],则不需要交换
2、下表是否越界。如果A[i]-1大于数组最大下标,也不需要移动。
public class No40_FirstMissingPositive {
public static void main(String[] args){
System.out.println(firstMissingPositive(new int[]{4,6,3,-1,1}));
}
public static int firstMissingPositive(int[] A) {
int i = 0;
while(i<A.length){
if(A[i]!=i+1 && A[i]>0 && A[i]-1<A.length && A[A[i]-1]!=A[i]){
swap(A, i, A[i]-1);
}
else i++;
}
i = 0;
while(i<A.length && A[i]==i+1) i++;
return i+1;
}
public static void swap(int[] A, int i, int j){
A[i] += A[j];
A[j] = A[i] - A[j];
A[i] = A[i] - A[j];
}
}