输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
借助了大顶堆的思路,priority_queue函数是基于堆数据结构的
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
/*
我们用一个大根堆实时维护数组的前 kk 小值。首先将前 kk 个数插入大根堆中,随后从第 k+1k+1 个数开始遍历,如果当前 遍历到的数比大根堆的堆顶的数要小,就把堆顶的数弹出,再插入当前遍历到的数。最后将大根堆里的数存入数组返回即可。 在下面的代码中,由于 C++ 语言中的堆(即优先队列)为大根堆,我们可以这么做。而 Python 语言中的对为小根堆,因此 我们要对数组中所有的数取其相反数,才能使用小根堆维护前 k 小值。
*/
vector<int>res(k,0);
int n= arr.size();
if(k==0){
return res;
}
priority_queue<int>myqueue;
for(int i=0;i<k;i++){
myqueue.push(arr[i]);
}
for(int j=k;j<n;j++){
if(arr[j]<myqueue.top()){
myqueue.pop();
myqueue.push(arr[j]);
}
}
for(int i=0;i<k;i++){
res[i]=myqueue.top();
myqueue.pop();
}
return res;
}
};