題目:
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.
題意:
給定一個未排序的整數數組,找出第一個錯過的正整數。
比如:
給定[1,2,0]
返回3,
[3,4,-1,1]返回2.
算法要求O(n) 時間復雜度和常數空間。
算法分析:
最簡單的思路就是對數組進行快速排序,但是由於要求O(n) 的時間復雜度,所以快速排序顯然是行不通的。
因此為了搜尋元素,這裡采用數組的下標作為其索引,即對數組的元素進行交換,將正數
i
放到i-1
的位置上,對於負數和大於數組長度的元素棄之不顧。這樣線性掃描一下數組就能得到第一個不存在的正數,即第j
位置的元素不等於j+1
。
AC代碼:
public class Solution { public int firstMissingPositive(int[] A) { //將正數放到值-1的位置上,這樣1放在0號位置,2放在1號位置,。。。。 if(A==null || A.length==0) return 1; for(int i=0;i0 && A[A[i]-1]!=A[i])//這裡A[A[i]-1]!=A[i]這個限制條件的意思是,已經滿足條件的就不交換了 { int temp=A[A[i]-1]; A[A[i]-1]=A[i]; A[i]=temp; i--; } } for(int i=0;i