如果序列最小的正数是2,那应该输出1。
简单版,排序然后找。
#include <bits/stdc++.h>
using namespace std;
int main(){
int num;
cin>>num;
vector<int> vec;
for(int i=0;i<num;i++){
int n;
cin>>n;
vec.push_back(n);
}
sort(vec.begin(),vec.end());
int val=0;
for(int i=0;i<num;i++){
if(vec[i]>0){
if(vec[i]==val+1)val=val+1;
else if(vec[i]==val)continue;
else break;
}
}
printf("%d",val+1);
}
进阶版指路41. 缺失的第一个正数,要求时间复杂度O(N),使用常数空间。(虽然在PTA上它们耗时和空间并没有什么大区别)
#include <bits/stdc++.h>
using namespace std;
int firstMissingPositive(vector<int>& nums) {
if(nums.size()==0)return 1;
int lastn=nums[0]-1;
for(int i=0;i<nums.size();i++){
while(nums[i]!=i+1 && nums[i]!=lastn){
if(nums[i]<=nums.size() && nums[i]>0){
lastn=nums[i];
swap(nums[i],nums[nums[i]-1]);
}
else break;
}
//else nums[i]=0;
}
int res=0;
for(int i=0;i<nums.size();i++){
if(nums[i]!=i+1)break;
else res=i+1;
}
return res+1;
}
int main(){
int num;
cin>>num;
vector<int> vec;
for(int i=0;i<num;i++){
int n;
cin>>n;
vec.push_back(n);
}
printf("%d",firstMissingPositive(vec));
}