1. 程式人生 > >Coding interview:陣列中未出現的最小正整數

Coding interview:陣列中未出現的最小正整數

題目描述

給定一個無序整型陣列array,找出陣列中未出現的最小正整數.
例如:
[-1,2,3,4] 返回1
[1,2,3,4] 返回5

解題思路

對於給定陣列長度為N,我們希望陣列中的資料為1,2,3,4…,N,這樣最小的正整數則為N+1,但是事實情況並非我們所期待的這樣,所以我們對陣列進行一個劃分,索引 i 左邊的陣列是從1開始逐個遞增的,相差為1。索引 j 右邊的資料是“無效資料”,“無效資料”的含義就是不在[1,N]中,或者已經出現重複的數字。初始狀態i==0,j=length-1,當i>j 的時候,說明已經完全遍歷了陣列,i的位置就是空缺沒有出現的正整數。具體演算法過程如下:

  1. 當array[I]== I+1,I++;
  2. 當array[I]<=I 或者 array[I] > N, array[I]為無效數字,交換到j的右邊,swap(I,j–);
  3. 當array[I] > I+1 && array[I] <=N,我們需要把array[I]這個數字放到array[I]-1 的位置上,但是如果array[I] 已經在array[I]-1 的位置上了,說明這個數字重複了,則同樣移動到j的位置右邊;

程式碼

int getMissNum(int[]array) {
        if (array==null || array.length==0) {
            return 1;
        }
        int i = 0;
        int j = array.length-1;
        int n = array.length;
        while(i<=j) {
            if (array[i] == i+1) {
                i++;
            } else if(array[i] <= i || array[i] > n || array[i] == array[array[i]-1]) {
                swap(array,i,j--);
            } else {
                swap(array,i,array[i]-1);
            }
        }
        return i+1;
    }

    private void swap(int[]array,int i,int j){
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }

    public static void main(String[]args) {
        MinPositiveNumber minPositiveNumber = new MinPositiveNumber();
        System.out.println(minPositiveNumber.getMissNum(new int[]{3,-1,1,7,7,7,7,9,10}));
    }