First Missing Positive
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.
ref: http://www.cnblogs.com/AnnieKim/archive/2013/04/21/3034631.html
虽然不能再另外开辟非常数级的额外空间,但是可以在输入数组上就地进行swap操作。
思路:交换数组元素,使得数组中第i位存放数值(i+1)。最后遍历数组,寻找第一个不符合此要求的元素,返回其下标。整个过程需要遍历两次数组,复杂度为O(n)。
下图以题目中给出的第二个例子为例,讲解操作过程。
最后,具体实现如下:
1 public class Solution { 2 public int firstMissingPositive(int[] A) { 3 int len = A.length; 4 int i = 0; 5 while(i < len){ 6 if(A[i] != i+1 && A[i] >= 1 && A[i] <= len && A[i] != A[A[i] -1]){ 7 swap(A, i, A[i]-1); 8 }else{ 9 i++; 10 } 11 } 12 13 for(int j = 0; j < len; j++){ 14 if(A[j] != j+1) 15 return j+1; 16 } 17 return len+1; 18 } 19 20 private void swap(int[] A, int a, int b){ 21 int tmp = A[a]; 22 A[a] = A[b]; 23 A[b] = tmp; 24 } 25 }
1 public class Solution { 2 public int firstMissingPositive(int[] A) { 3 // Start typing your Java solution below 4 // DO NOT write main() function 5 int len = A.length; 6 7 for(int i = 0; i <len; i++){ 8 while(A[i] != i+1){ 9 10 /* A[i] == A[A[i]-1]是为了检测当前值是否和前一个值相等 11 * eg: A[2] =3 && A[3] =3, A[2] = A[A[3]-1]不加将进入死循环 12 */ 13 if(A[i] > len || A[i] <=0 || A[i] == A[A[i]-1]){ 14 // break 是跳出while 15 break; 16 } 17 18 int temp = A[i]; 19 A[i] = A[temp -1]; 20 A[temp-1] = temp; 21 } 22 } 23 24 for(int i = 0; i < len; i++){ 25 if(A[i] != i+1) 26 return i+1; 27 } 28 29 return len+1; 30 } 31 }