原題如下:
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.
如果沒有O(n)時間複雜度的要求,可以首先對數組進行排序,然後在有序數組中進行查找第一個缺失的正數。這樣其複雜度爲排序的時間複雜度O(nlogn)。int firstMissingPositive(int A[], int n) {
if(n == 0)
return 1;
if(n == 1){
if(A[0] == 1)
return 2;
return 1;
}
sort(A,A + n);
int i = 0;
for(; i < n; i++){
if(A[i] > 0 )
break;
}
if(i >= n && A[n - 1] <= 0)
return 1;
if(A[i] != 1)
return 1;
while(++i < n){
if(A[i] - A[i - 1] == 1 || A[i] - A[i - 1] == 0)
continue;
break;
}
if(i < n)
return A[i - 1] + 1;
return A[n - 1] + 1;
}
在時間複雜度爲O(n)的前提下,排序方法是不可用的,此時可以藉助數組下標與數組元素的對應關係來進行判斷,我們可以讓A[i] 存放i+1,然後再從頭查找不滿足此條件的數組即可得出第一個缺失的正數,特殊情況是都滿足此條件,最後返回n + 1.。在遍歷的過程中,我們只關注0到n之間的元素而對其他元素不考慮,另外就是交換時要用while(而不能用if)來進行連續交換,以避免某些元素沒有回到最終的位置(因爲有可能交換髮生在已遍歷的元素中)。
int firstMissingPositive(int A[], int n) {
if(n == 0)
return 1;
for(int i = 0; i < n; i++){
while(A[i] != i + 1 && A[i] > 0 && A[i] <= n && A[A[i] - 1] != A[i])
swap(A[i],A[A[i] - 1]);
}
for(int i = 0; i < n; i++){
if(A[i] != i + 1)
return i + 1;
}
return n + 1;
}