40. 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.

---

constant space, --> swap!

桶排序,只不过不许用额外空间。

每次当A[i]!= i的时候,将A[i]与A[A[i]]交换,也就是把A[i]放到它应该在的位置A[A[i]]

直到无法交换位置。

---

不能按照A[i] = i来存, 题目是检查positive integer,没有0的事情

比如当A = {1},如果A[0] = 0的话,根本没地方存1的值了。

所以正确的存储方式应该是A[i]= i+1.

---

然后重新走一遍,检查A[i] == i+1

O(n)

 

public class Solution {
    public int firstMissingPositive(int[] A) {

        int i = 0;
        int n = A.length;
        
        while (i < n){
            
            int val = A[i];
            
            if(val != (i+1) //当前存值不对
                    && val >= 1 //val要存在val-1,太小的超出数组边界
                    && val <= n //val要存在val-1, 太大的超出数组边界
                    && A[val-1] != val) // val应该存放的地方A[val-1],
                    // 已经放好了正确值A[i], dup {1,1}, 不用转存
                    
                swap(A, i, A[i]-1);
            else
                i++;
        }
        for (i = 0; i < n; ++i)
            if (A[i] != (i+1))
                return i+1;
        return n+1;
        
    }
    
    private void swap(int[] arr, int i, int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

 

posted @ 2013-09-15 10:33  LEDYC  阅读(137)  评论(0)    收藏  举报