题目描述
输入n个整数,找出其中最小的k个数。
注意:
- 数据保证k一定小于等于输入数组的长度;
- 输出数组内元素请按从小到大顺序排序;
样例
Input:[1,2,3,4,5,6,7,8] , k=4
Output:[1,2,3,4]
解题思路
-
描述
我们定义一个count用于计数,一个val用于存储计数的数字。遍历数组,如果count为0,则将当前值赋值val,然后count++;如果count不为0,如果当前值等于val,则count++,否则count–。
本题目可通过维护一个长度为k的大顶堆实现。
STL中的priority_queue(优先队列) 本质上就是一个大顶堆。
-
实现代码:
/* 包含头文件: #include <queue> */ vector<int> getLeastNumbers_Solution(vector<int> input, int k) { priority_queue<int> heap; for(int i=0; i < input.size();i++) { heap.push(input[i]); if(heap.size() > k) { heap.pop(); } } vector<int> res; while(heap.size()) { res.push_back(heap.top()); heap.pop(); } reverse(res.begin(),res.end()); return res; }
-
复杂度分析
时间复杂度: O ( n l o g k ) O(nlog^k) O(nlogk)
空间复杂度: ≈ O ( k ) \approx O(k) ≈O(k)