最小的K个数

题目:输入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 };

 

posted @ 2019-10-22 17:00  wtzhang  阅读(150)  评论(0编辑  收藏  举报