寻找第K大

来源:互联网 发布:软件打包安装工具 编辑:程序博客网 时间:2024/04/27 19:53

Question

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

Algorithm

这题用优先队列解决,优先队列的底层就是堆
先弄清楚什么是大顶堆,小顶堆

  • 大顶堆:堆顶元素最大
  • 小顶堆:堆顶元素最小

寻找第K大的元素,用小顶堆解决,这样顶端元素是最小的,维持堆中元素个数为K,那么一旦堆中元素个数大于K,最小的在堆顶,pop即可,那么堆中始终是最大的K的数,数组遍历完后,堆顶元素就是第K大的元素。

换个思路,这题也可以用大顶堆,把题目稍微变换一下就是,寻找第num.size()-K+1小的元素。

C++中STL优先队列用法请参照这篇博客:
http://blog.csdn.net/sup_heaven/article/details/8036982

Code

大顶堆实现

class Finder {public:    int findKth(vector<int> a, int n, int K) {        // write code here        priority_queue<int> q;        for(int i=0;i<a.size();i++){            q.push(a[i]);            if(q.size() > (a.size()-K+1))                q.pop();        }        return q.top();            }};

小顶堆实现

class Finder {public:    int findKth(vector<int> a, int n, int K) {        // write code here        priority_queue<int,vector<int>,greater<int>> q;        for(int i=0;i<a.size();i++){            q.push(a[i]);            if(q.size() > K)                q.pop();        }        return q.top();    }};
0 0
原创粉丝点击