PAT 1144 The Missing Number

这一题是求一个序列中找出缺失的最小的那个正数,比如序列: 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值