这一题是求一个序列中找出缺失的最小的那个正数,比如序列: 3 -3 5 4中,缺失的最小数字的是1。
这一题原来用数组确认每个数字是否存在来实现(先去掉0和负数),但是数字的大小是int范围的,数组开不了这么大。用插入排序会超时,在搜索不出什么好方法后,只好用优先队列解决。
补充:搜索后发现别人是用数组解决的,原来觉得有问题,后来想了想明白了,数字的个数限制是100000个,把大于十万的数过滤掉,这样最小的正数一定在十万以内,当出现大于十万的数,十万以内的一个数可能不在序列中,这样就可以通过数组实现,把数组开到比十万大一点。
方法一
#include <bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> > que;
int main()
{
int n;
int d;
scanf("%d",&n);
int j=0;
for(int i=0;i<n;i++){
scanf("%d",&d);
if(d>0)
que.push(d);
}
if(que.empty()){
printf("%d\n",1);
}
else{
int before = que.top();
que.pop();
if(before >1){
printf("%d\n",1);
}
else{
while(!que.empty()){
int now = que.top();
que.pop();
if(now!=before +1 && now !=before){
break;
}
before =now;
}
printf("%d\n",before+1);
}
}
return 0;
}
方法二
#include <bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> > que;
int a[100005]={0};
int main()
{
int n;
int d;
scanf("%d",&n);
int j=0;
for(int i=0;i<n;i++){
scanf("%d",&d);
if(d>0&& d<100005)
a[d] = 1;
}
for(int i=1;i<=100005;i++){
if(a[i]==0){
printf("%d\n",i);
break;
}
}
return 0;
}