题目描述:
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组
思路:
最小堆;最小堆的堆顶是整个堆的最小数
代码如下:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int>res;
int n=input.size();
if(k>n||k==0) return res;
priority_queue<int,vector<int>>pq;
for(int val:input){
if(pq.size()<k){
pq.push(val);
}
else{
if(val<pq.top()){
pq.pop();
pq.push(val);
}
}
}
while(!pq.empty()){
res.push_back(pq.top());
pq.pop();
}
return res;
}
};
扩展:最大堆最小堆
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main(){
vector<int>nums;
nums.push_back(4);
nums.push_back(5);
nums.push_back(1);
nums.push_back(6);
nums.push_back(2);
nums.push_back(7);
nums.push_back(3);
nums.push_back(8);
priority_queue<int,deque<int>,greater<int> > q1;//最小堆
for(int i=0;i<nums.size();i++){
q1.push(nums[i]);
}
while(!q1.empty()){
cout<<q1.top()<<" ";
q1.pop();
}
cout<<"最小堆"<<endl;
priority_queue<int> q2;//最大堆
for(int i=0;i<nums.size();i++){
q2.push(nums[i]);
}
while(!q2.empty()){
cout<<q2.top()<<" ";
q2.pop();
}
cout<<"最大堆"<<endl;
cout<<"hello"<<endl;
}