TopK问题
输入数组arr,找出其中最大的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最大的4个数字是5、6、7、8。
示例一:
输入:arr = [3,2,1], k = 2
输出:[3,2]或者[2,3]
示例二:
输入:arr = [0,1,2,1], k = 1
输出:[2]
解题思路:
1.先把数组中前K个数据,建成大堆
2.然后剩下的N-K个数,跟堆顶的数据比较,如果比堆顶的数据小,则替换堆顶的数据,调堆。
3.最后堆里面的就是最小的K个数
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> vec(k, 0);
if (k == 0)
{
return vec;
}
priority_queue<int> Q;
for (int i = 0; i < k; ++i)
{
Q.push(arr[i]);
}
for (int i = k; i < (int)arr.size(); ++i)
{
if (Q.top() > arr[i]) {
Q.pop();
Q.push(arr[i]);
}
}
for (int i = 0; i < k; ++i)
{
vec[i] = Q.top();
Q.pop();
}
return vec;
}
};