Coding interview:陣列中未出現的最小正整數
阿新 • • 發佈:2018-12-06
題目描述
給定一個無序整型陣列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的位置就是空缺沒有出現的正整數。具體演算法過程如下:
- 當array[I]== I+1,I++;
- 當array[I]<=I 或者 array[I] > N, array[I]為無效數字,交換到j的右邊,swap(I,j–);
- 當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})); }