Given an unsorted integer array, find the first missing positive integer.
Have you met this question in a real interview? Yes
Example
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.
Challenge
Your algorithm should run in O(n) time and uses constant space.
public class Solution {
public int firstMissingPositive(int[] A) {
int i = 0;
while (i < A.length) {
/*思路:交换数组元素,使得数组中第i位存放数值(i+1)。最后遍历数组,寻找第一个不符合此要求的元素,返回其下标。整个过程需要遍历两次数组,复杂度为O(n)。
其实交换的条件就是3个:
1: A[i] is in the range;
2: A[i] > 0.
3: The target is different; (如果不判断这个,会造成死循环,因为你交换过来一个一样的值)
*/
if (A[i] != i + 1 && A[i] >= 1 && A[i] <= A.length && A[A[i] - 1] != A[i]) {
int tmp = A[A[i] - 1];
A[A[i] - 1] = A[i];
A[i] = tmp;
//交换
} else
i++;
}
for (i = 0; i < A.length; i++) {
if (A[i] != i + 1)
return i + 1;
}
return A.length + 1;
}
}