最小的K个数
用堆来解决,时间复杂度为O(nlogk)或者O(nlogn),其中n为数组的长度
优先队列
(77条消息) 优先队列(priority_queue)总结_行止AC的博客-CSDN博客
#include<queue>
#include <vector>
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if(input.empty() || k==0) return res;
priority_queue<int, vector<int>, greater<int>> q;//(小根堆)优先队列
for(auto x:input) q.push(x);
while(k--){
res.push_back(q.top());
q.pop();
}
return res;
}
};
寻找第K大
1. sort()--->a[k-1], 快速排序;
2. 建立一个小顶堆,用于存储数组中 k 个最大的数,那么堆顶元素就是第 k 大的数,堆排序
#include <functional>
#include <queue>
class Solution {
public:
int findKth(vector<int> a, int n, int K) {
//快速排序
// sort(a.begin(), a.end(), greater<int>());
// return a[K-1];
//优先队列
priority_queue<int, vector<int>, greater<>>q;
for(int i=0; i<K; i++) q.push(a[i]);
for(int i=K; i<n; i++){//最后顶部就是第k大的数
if(a[i] > q.top()){q.pop(); q.push(a[i]);}
}
return q.top();
}
};
数据流中的中位数
#include <algorithm>
#include <vector>
class Solution {
public:
vector<int> v;
void Insert(int num) {
v.push_back(num);
}
double GetMedian() {
int len = v.size();
sort(v.begin(), v.end());
if(len%2==0) return double(v[len/2]+v[len/2-1])/2;
else return double(v[(len-1)/2]);
}
};
- 初始化一个大根堆,存中位数左边(较小的数)的数据,一个小根堆,存中位数右边的数据
- 动态维护两个数据结构的大小,即最多只相差一个
#include <algorithm>
#include <queue>
#include <vector>
class Solution {
public:
priority_queue<int, vector<int>, less<int>>maxq;//大根堆(保存中位数左边)
priority_queue<int, vector<int>, greater<int>>minq;//小根堆(保存中位数右边)
void Insert(int num) {
if(maxq.empty() || num < maxq.top()) maxq.push(num);
else minq.push(num);
if(maxq.size() > minq.size()+1){
minq.push(maxq.top());
maxq.pop();
}else if(minq.size() > maxq.size()+1){
maxq.push(minq.top());
minq.pop();
}
}
double GetMedian() {
if(maxq.size() > minq.size()) return maxq.top();
else if(maxq.size() < minq.size()) return minq.top();
else return (maxq.top()+minq.top())/2.0;
}
};