这道题和之前做过的在O(n)时间查找长度为n的数组中是否存在重复元素的思路相似。 我们还是在O(n)时间内将每一个符合要求的数A[i] = i;那么置换过后出现过的n以内正数都会在其位置上,我们只需遍历一遍,找到A[i]!=i的输出即可。 要注意的是这样置换的话只能将1--n-1的数置换到其位置上,所以如果在1--n-1上都正确,我们要判断A[0]是否为n来确定输出n或是n+1。
public class Solution {
public int firstMissingPositive(int[] A) {
int len = A.length;
if( len == 0 )
{
return 1;
}
int st=0;
while( st<len )
{
if( A[st] == st )
{
st++;
continue;
}
if( A[st]>=0 && A[st]<len && A[A[st]] != A[st] )
{
int tmp = A[st];
A[st] = A[A[st]];
A[tmp] = tmp;
continue;
}
else
{
st++;
}
}
for( int i=1;i<len;i++ )
{
if( A[i] != i )
{
return i;
}
}
if( A[0] == len )
{
return len+1;
}
return len;
}
}