寻找第k大数字(numberk)

标签: 算法 第k大元素 c++ 优先队列
149人阅读 评论(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;
}
查看评论

美化你的文字

  想玩点文字横向拉宽的特效吗?很简单,你不需要去计算什么 Width + 1 之类的象素值,只需调用一个 API 函数,就可以搞定!她就是——SetTextCharacterExtra()   这个...
  • AttaBoy
  • AttaBoy
  • 2001-05-30 19:39:00
  • 852

2016/12/8 1004. 寻找第k大数字(numberk)

这个问题有很多博客讨论了,这里是STL拯救世界,直接构造出了优先序列。以后还是认真看看这个问题吧。 // Problem#: 19855 // Submission#: 4951919 // The...
  • Azure10dai
  • Azure10dai
  • 2016-12-08 21:14:11
  • 817

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

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

#sicily#1001.寻找第k大数字(numberk)

source:http://soj.sysu.edu.cn/show_problem.php?pid=1001&cid=2449 密码:gjr题目Description经过长时间的筹备工作,在Jour...
  • LoHiauFung
  • LoHiauFung
  • 2016-12-14 14:13:19
  • 974

寻找第k大数字

1003. 寻找第k大数字(numberk)
  • t6_17
  • t6_17
  • 2016-12-10 14:20:57
  • 1174

利用快排思想寻找数组中第K大(小)的数字

利用快排的思想寻找数组中第K大(小)的数字。举例:给定一个整数数组num,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。如输入数组[1,3,5,2,2],5,3,返回...
  • u012050154
  • u012050154
  • 2016-11-17 09:59:37
  • 1059

两个有序数组寻找合并之后第k大的数

http://m.blog.csdn.net/blog/fangkyo/8114784 经常有同学在面试或者笔试的时候遇到两个有序数组(未必等长)找第k个数的问题。归并比较的方法固然可以...
  • lqglqglqg
  • lqglqglqg
  • 2015-10-01 10:54:42
  • 665

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

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

寻找无序数组中第k大的数

对于一个无序的数组,怎样找到其中第k大的数呢?下面总结几种方法。1.直接排序法使用常见的归并排序、堆排序等算法对数组进行排序,然后找到第k大的数。排序算法的时间复杂度为O(nlogn),所以算法总的时...
  • yc461515457
  • yc461515457
  • 2016-04-18 10:39:13
  • 3385

寻找数组中的第K大的元素&找数组中重复数字

问题1:寻找数组中的第K大的元素。public class FindMaxKNum { public static void main(String args[]) { int...
  • u013735511
  • u013735511
  • 2017-04-09 18:13:25
  • 182
    个人资料
    持之以恒
    等级:
    访问量: 3433
    积分: 178
    排名: 91万+
    文章分类