標籤:style blog http color os io
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.
題解:開始想的是用一個hashmap儲存數組中的每個值,然後遍曆數組看看每個值-1和+1的值在不在map裡面,後來發現只要用常數空間。就只能另想方法。
其實我們可以用原來的數組作為hash表,使得A[i] = i+1,通過不停的交換做到這一點,那麼最後A[i] != i+1的i+1就是missing的數;
因為數組中除了missing的值,其他值都是連續的,所以數組中可能存放的最大值是n+1;
以題目中的例子為例:
最終A[1] != 1+1 = 2,所以缺失的2;
代碼如下:
1 public class Solution { 2 private void swap(int[] A,int a,int b){ 3 int temp = A[a]; 4 A[a] = A[b]; 5 A[b] = temp; 6 } 7 public int firstMissingPositive(int[] A) { 8 //make A[i] = i+1 9 for(int i = 0;i < A.length;i++){10 while(A[i] <= A.length && A[i] > 0 && A[i] != i+1 && A[i] != A[A[i]-1])11 swap(A, i, A[i]-1);12 }13 14 //find the missing one15 for(int i = 0;i < A.length;i++)16 if(A[i] != i+1 )17 return i+1;18 19 return A.length+1;20 }21 }