题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
这道题可以用大根堆来做,大根堆的top元素是整个堆里面最大的元素。我们往大根堆里面加元素,如果堆里面的个数大于K了,就把堆顶元素弹出来,所以弹出来的是堆中的最大元素。由于每一次弹出的都是最大元素,所以最后剩下的K个数一定是最小的K个。
c++代码如下:
1 class Solution { 2 public: 3 vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { 4 if(k > input.size()) return vector<int>({}); 5 priority_queue<int> q; 6 vector<int> res; 7 for(auto x : input){ 8 q.push(x); 9 if(q.size() > k) q.pop(); 10 } 11 while(q.size()){ 12 res.push_back(q.top()); 13 q.pop(); 14 } 15 reverse(res.begin(), res.end()); 16 return res; 17 } 18 };