输入n个整数,找出其中最小的k个数。
注意:
数据保证k一定小于等于输入数组的长度;
输出数组内元素请按从小到大顺序排序;
样例
输入:[1,2,3,4,5,6,7,8] , k=4
输出:[1,2,3,4]
常见解法:
- 排序
 
- 借助堆: 借助大小为K的堆,从而实现快速比较。
 
- 线性选择(快排思想) —普通:最坏的时间复杂度$O(lgn)$
 
- 线性选择(快排思想) —基于中位数的select升级:借助基于中位数的select算法来选择枢点,可以尽可能的2分问题,从而使得最坏的时间复杂度控制在$O(n)$
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
   | class Solution { public:     vector<int> getLeastNumbers_Solution(vector<int> input, int k) {         priority_queue<int, vector<int>, less<int>> q;                   for (int i = 0; i < input.size(); ++i) {             if (q.size() < k) {                 q.push(input[i]);             }             else {                 if (input[i] < q.top()) {                     q.pop();                     q.push(input[i]);                 }             }         }                  vector<int> res;                  while (q.size()) {             res.push_back(q.top());             q.pop();         }                  reverse(res.begin(), res.end());         return res;     } };
  |