思路一:对数组先排序,然后设定一个指针p从1开始,正向扫描数组,发现数组和p相等就更新p,即p++,查看下一个数字是不是在序列中。但是不符合题意,因为排序的时间复杂度是NlogN
class Solution {
public:
int firstMissingPositive(int A[], int n) {
if(A == nullptr || n <= 0)
return 1;
sort(A, A + n);//排序
int p = 1;
for(int i = 0; i < n; i++){
if(A[i] == p)
p++;//查看下一个数字在不在序列
}
return p;
}
};
思路二:将1放到数组0号位置,将2放到1号位置....以此类推。然后正向扫描数组,发现A[i] != i + 1就直接返回i+1即可
class Solution {
public:
void swap(int & a, int & b){
a =a ^ b;
b = a ^ b;
a = a ^ b;
}
int firstMissingPositive(int A[], int n) {
if(A == nullptr || n <= 0)
return 1;
for(int i = 0; i < n; i++){
while(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 1 + n;
}
};