剑指Offer-第17天 排序(中等)
第一题
题目链接:https://leetcode.cn/problems/zui-xiao-de-kge-shu-lcof/
个人题解:设置优先队列,存入 \(k\) 个值,然后弹出即可
代码:
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> res;
priority_queue<int> heap;
for(auto x:arr){
heap.push(x);
if(heap.size()>k) heap.pop();
}
while(heap.size()){
res.push_back(heap.top());
heap.pop();
}
reverse(res.begin(),res.end());
return res;
}
};
运行截图:
第二题
题目链接:https://leetcode.cn/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/
个人题解:用两个优先队列
- 一个小根堆来维护最大值,一个大根堆来维护最小值
- 如果大根堆小,中位数就是队首元素,否则就是两个堆队首元素之和
- 插入数字的时候,比较两个队列的队首即可。
代码:
class MedianFinder {
public:
priority_queue<int,vector<int>,less<int>> q1;
priority_queue<int,vector<int>,greater<int>> q2;
/** initialize your data structure here. */
MedianFinder() {
}
void addNum(int num) {
if(q1.empty() || num<=q1.top()){
q1.push(num);
if(q2.size()+1<q1.size()){
q2.push(q1.top());
q1.pop();
}
}
else{
q2.push(num);
if(q2.size()>q1.size()){
q1.push(q2.top());
q2.pop();
}
}
}
double findMedian() {
int n=q1.size(),m=q2.size();
if(n>m) return q1.top();
return (q1.top()+q2.top())/2.0;
}
};
运行截图: