First Missing Positive
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.
======================================================================================不开额外空间,就用A[]本身作为存储
最理想的情况是数组里的数字都在1-n之间
设置两个游标,一个在最后面,用来收集垃圾(不在范围内的),另一个在最前面
从头遍历,如果超过范围,就扔到最后面,把后面的交换过来,同时有效范围减小1(即最后面的游标向前移动1位,前面的不动)
如果在范围内,而且恰好第一个数是1,那么前面的游标移动到下一个位置,说明此时数字1通过,没有missing
如果是范围内的其他数字,那么就与该数字应该在的位置上的数作交换,比如数字为2,那么就与数组中第二个数A[1]作交换,两个游标都不动
这样循环直到前面的游标超过后面的游标,此时原来的前面游标指示的位置就是missing的数字
======================================================================================
class Solution {
public:
int firstMissingPositive(int A[], int n) {
int i, j, t;
for (i = 0, j = n-1; i <= j; i++)
{
if (A[i] > j+1 || A[i] <= 0 || A[i] == A[A[i]-1] && i != A[i]-1)
{
A[i] = A[j];
j--;
i--;
}
else if (i == A[i]-1)
{
continue;
}
else
{
t = A[A[i]-1];
A[A[i]-1] = A[i];
A[i] = t;
i--;
}
}
return i+1;
}
};