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.
solution: 在一个n大小的数组中找first missing positive,关键在于统计最小的x个正数,然后得到的数值自然是x+1,所以该题的方法有点类似于基数排序那种,不过因为只能使用常量大小的空间,所以只能是比对A[ A[i]-1 ]和A[i]并进行交换,因此数也必须在1-n之间,然后得到一个数组,当中1-n的数是顺序排序的,其它都是原样,依次我们能得到x+1,最坏情况是该数组所有数都在1-n之间,所以最终只能返回n+1.
class Solution {
public:
int firstMissingPositive(int A[], int n) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(A == NULL || n <= 0)
return 1;
for(int i = 0; i < n; i++)
{
if( A[i] > 0 && A[i] <= n && A[i] != A[ A[i]-1 ] && A[i]-1 != i )
{
int temp = A[ A[ i ] - 1 ];
A[ A[i]-1 ] = A[ i ];
A[ i ] = temp;
i--;
}
}
for(int i = 0; i < n; i++)
{
if(A[i] != i+1)
return i+1;
}
return n+1;
}
};