原题如下:
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;
}