思路:将第 i 个正数存放在第i个位置,即 A[i] = i,这个过程需要扫描一遍,复杂度为O(n),然后就是遍历一遍检验,时间复杂度也是O(n),如果A[i] != i,则i是第一个消失的正数。注意的是因为n可能存在A[0]位置上面,如果A[0] = n,则消失的正数为 n + 1,否则就是 n。
code:
class Solution {
public:
void swap(int &a,int &b){
a ^= b;
b ^= a;
a ^= b;
}
int firstMissingPositive(int A[], int n) {
int start = 0;
while(start < n){
if(A[start] > 0 && A[start] != start && A[start] < n && A[start] != A[A[start]]){
swap(A[start],A[A[start]]);
}
else
start++;
}
for(int i = 1;i < n;i++)
if(A[i] != i)
return i;
return A[0] == n ? n+1 : n;
}
};