Leetcode 面试题40. 最小的k个数 题解

原题描述如下:

 

 

 第一次的解法:排序法

直接用C++自带的sort排序,输出前n个元素:

1 vector<int> getLeastNumbers(vector<int>& arr, int k) {
2     sort(arr.begin(),arr.end());
3     vector<int> narr(arr.begin(),arr.begin()+k);
4     return narr;
5 }

看了题解之后,发现了更有效的解法,即

第二次解法:大顶堆法

 1     vector<int> getLeastNumbers(vector<int>& arr, int k) {
 2         priority_queue<int> pq;
 3         vector<int> narr(k);
 4         if(k){ //k大于0再进行
 5             for(int i=0;i<k;i++){ //先插入k个元素
 6                 pq.push(arr[i]);
 7             }
 8             for(int i=k;i<arr.size();i++){  //对于arr中k个元素之后的元素
 9                 if(pq.top()>arr[i]){ //只有比堆顶元素大了才能插入堆中,同时将原堆顶元素抛出
10                     pq.pop();
11                     pq.push(arr[i]);
12                 }
13             }
14             for(int i=0;i<k;i++){ //最后将堆中的元素存入数组
15                 narr[i]=pq.top();
16                 pq.pop();
17             }
18         }
19         return narr;
20     }
21             

大顶堆法的好处是:没有必要将所有元素排序,题目只要求找出前k个元素,且这k个元素之间可以乱序,因此我们使用堆就可以维护前k个元素,同时避免对整个数组的排序

 

posted @ 2020-03-20 15:09  rxd_呼啦啦的少年  阅读(142)  评论(0)    收藏  举报