关闭

寻找第k大数字(numberk)

标签: 算法第k大元素c++优先队列
93人阅读 评论(0) 收藏 举报
分类:
                           Time Limit: 10sec    Memory Limit:256MB

Description
经过长时间的筹备工作,在Jourk,Ronny,Plipala,阿长,阿沈等人的努力下,DM实验室建立起自己的系列网站,其中包括三个大板块:DMOJ首页、DMOJ论坛、DMOJ博客。
作为一个大型的网站,数据的加工处理需要用到很多算法系统模块,通过这些模块对系统主数据库进行修改。因此,在构建DMOJ系列网站的过程中,编写了一个庞大的数据统计系统,其中包括一个寻找第k大数字的模块,对于一个数据库来说,这样一个模块的重要性不容置疑。但是,由于在修改网站的过程中,这个模块被不慎删掉了,DMOJ找到了聪明的你,希望你能帮DMOJ重写这个模块。
对于输入数据,你将按数据要求找出n个数字中的第k大数字。
关于第k大数字的解释:对于一个数字序列,计算该数字序列第k大数字,一种可行但效率不高的方法是,首先剔除数字序列中重复的数字,然后通过某种排序算法,获得剔除重复数字后的数字序列从大到小排序的数字序列,然后取从大到小排序的数字序列的第k位的数字。从另一个角度,题目中的第k大数字即是不计入数字序列中数字重复出现的部分,对于数字重复出现的情况,应该认为该数字只出现一次。
现在请聪明的你尝试设计一种可行且效率更高的方法来解决这个问题。
Input
输入数据一共有三行。
第一行有一个正整数n(n<=10000000),表示一共给出多少个数字。
第二行有一个正整数k(k<=10000000),表示要求你找出第k大数字。
第三行有n个整数,给出n个数字。对于每个整数i,均满足-10000000<=i<=10000000。
Output
输出文件共一行,包含一个整数,表示n个数字中第k大数字是多少。
Sample Input
Copy sample input to clipboard
3
2
2006 2007 2008
Sample Output
2007
Hint
不能使用algorithm的sort/qsort函数

思路

用普通的算法肯定会超时,我们直接用优先队列,插进去的时候直接是有序的,我们按照升序的方式来用优先队列,使得队列始终只有k个元素,到最后队列顶端的数就是第k大的数

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

priority_queue<int, vector<int>, greater<int>> q, p;

bool visited[20000002];

int main() {
    int num, temp, tag;
    cin >> num >> tag;
    while(num--) {
        cin >> temp;
        if(visited[10000000+temp] == false) {
            q.push(temp);
            visited[10000000+temp] = true;
        } else {
            continue;
        }
        if(q.size() > tag) {
            q.pop();
        }
    }
    cout << q.top() << endl;

    p.push(1);
    p.push(2);
    cout << p.top() << endl;

    return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

[C++日常小题] 寻找第k大数字(numberk)

Description经过长时间的筹备工作,在Jourk,Ronny,Plipala,阿长,阿沈等人的努力下,DM实验室建立起自己的系列网站,其中包括三个大板块:DMOJ首页、DMOJ论坛、DMOJ博...
  • Elliott_Yoho
  • Elliott_Yoho
  • 2016-12-13 14:10
  • 1614

Top K算法和寻找第K个最小的数

关于Top K算法和寻找第K个最小的数这种经典问题网上已经说的很详细了,不过毕竟不是自己的,这里自己总结一下,而且这两个问题又稍稍有点区别。 1.Top K算法:即寻找一列数中K个最小值或K个最大值,...
  • moses1213
  • moses1213
  • 2016-01-19 19:34
  • 1589

寻找第K大的数(快排思想)

使用快排思想找第K大的数,算法复杂度O(n)。1.以数组a的第0位a[0]为参考基准base,将数组划分为两个部分; 如果找第K大的数,则将大于base的数往前挪,将小于base的数往后挪。如果找第...
  • yingyujianmo
  • yingyujianmo
  • 2016-04-15 22:27
  • 1931

寻找第K大的数字

寻找第k大的数字,有很多方法,最基本的就是将数组按照从大到小的顺序排列,找出第k个元素即可。但是这种方法的时间复杂度为o(nlog(n)),我们还能找到更好地方法。下面我们将介绍另外两种办法,一种是基...
  • xiamentingtao
  • xiamentingtao
  • 2015-09-08 10:12
  • 606

寻找单个无序数组中第K小的数字

1、对数组进行排序,然后前K个元素就是需要查找的元素,排序的方法可以采用快速排序,但是我们知道在快速 排序中如果已经是有序的数组,采用快速排序的时间复杂度是O(N^2),为了解决这种问题,通常选择随...
  • u011846436
  • u011846436
  • 2014-08-10 11:10
  • 577

【数字之魅】寻找最大的K个数(求第k大的数)

前言:编程之美上并没有给出实际的代码,这里我参考yoona博主的做法自己也写了一遍,并记录下来。 与此相似的题目是: - 求第k大的数 - 求第k小的数 这里给出比较好的两个做法,分别是快...
  • z702143700
  • z702143700
  • 2015-10-12 11:53
  • 760

寻找最小k个数或者寻找第K大的数字

Problem输入n个整数,找出最小的前k个数字(或者第K大的数字),例如输入4,5,1,6,2,7,3,8这八个数,则输出最小4个数是1,2,3,4.Solution AO(n)解法,需要修改输入数...
  • lime1991
  • lime1991
  • 2015-08-31 23:01
  • 416

HDOJ 1280查找前k大的数字

Problem Description还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小...
  • zxasqwedc
  • zxasqwedc
  • 2011-07-18 09:22
  • 682

用堆排序实现线性时间查找前K大数字

1004. 寻找前k大的数(选做) Total: 339 Accepted: 44       ...
  • qwtangwenqiang
  • qwtangwenqiang
  • 2014-12-03 09:30
  • 214

在线性时间内,求一组数中的第k大的数字

问题:在线性时间内,求一组数中的第k大的数字; 输入:第一行为数字n 第二行输入n个数字 第三行输入k 分析: 1.    首先建立个数组存储这一组数字 2.    随机选取一个数字作为支...
  • qq_32126633
  • qq_32126633
  • 2016-11-22 12:00
  • 211
    个人资料
    • 访问:2697次
    • 积分:156
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:3篇
    • 译文:0篇
    • 评论:31条
    文章分类