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 }       

 

 

 

posted @ 2014-01-24 02:52  Razer.Lu  阅读(208)  评论(0编辑  收藏  举报