最小的K个数_牛客题霸_牛客网 (nowcoder.com)
排序算法:
这里用到一个优先级队列priority_queue:默认大根堆 从大到小排列 顶端最大
也可以通过修改比较函数改成小根堆
priority_queue<int,vector<int> > pq表示一个存储整形数据的优先队列,使用vector作为底层容器进行存储;
class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> res; if(k == 0 || k >input.size()) return res; priority_queue<int,vector<int> > pq; //默认大根堆 从大到小排列 顶端最大 for(const int val : input){ if(pq.size() < k) pq.push(val); else{ if(val < pq.top()){ pq.pop(); pq.push(val); } } } while(!pq.empty()){ res.push_back(pq.top()); pq.pop(); } sort(res.begin(),res.end()); return res; } };
- 时间复杂度:O(nlog2k),构建和维护大小为k的堆,需要log2k,加上遍历整个数组
- 空间复杂度:O(k),堆空间为k个元素