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 one 15 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 }