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个元素,同时避免对整个数组的排序

浙公网安备 33010602011771号