剑指offer 41. 最小的k个数

简介: 剑指offer 41. 最小的k个数

题目描述

输入 n 个整数,找出其中最小的 k 个数。

注意:

  • 输出数组内元素请按从小到大顺序排序;


数据范围

1≤k≤n≤1000

样例

输入:[1,2,3,4,5,6,7,8] , k=4
输出:[1,2,3,4]


方法一:堆排序 O(nlogk)

这道题可以利用大根堆的性质来做(大顶堆的堆顶是该堆中所有元素的最大值):


  1. 将数组中所有元素都放入大根堆中,由于大根堆堆顶是最大的元素,所以只要堆中元素数量大于 k ,就 pop 出去,这样最终堆中得到的元素是前 k 小的元素。
  2. 用一个数组接收堆中元素的输出。
  3. 因为每次放入的都是最大元素,所以数组中元素是从大到小,最后还需要翻转一下顺序。
class Solution {
public:
    vector<int> getLeastNumbers_Solution(vector<int> input, int k) {
        priority_queue<int, vector<int>> q; //大根堆
        for (auto x : input)
        {
            q.push(x);
            if (q.size() > k)  q.pop(); //堆中元素个数大于k时,开始弹出堆顶即最大的元素
        }
        vector<int> ans;
        while (q.size()) ans.push_back(q.top()), q.pop();
        reverse(ans.begin(), ans.end());  //将数组调整成从小到大的顺序
        return ans;
    }
};


欢迎大家在评论区交流~

目录
相关文章
【剑指offer】-最小K个数-28/67
【剑指offer】-最小K个数-28/67
【剑指offer】-把数组排成最小的数-33/67
【剑指offer】-把数组排成最小的数-33/67
|
2月前
|
Java
每日一题《剑指offer》数组篇之把数组排成最小的数
每日一题《剑指offer》数组篇之把数组排成最小的数
32 0
每日一题《剑指offer》数组篇之把数组排成最小的数
|
2月前
牛客网-最小的k个数
牛客网-最小的k个数
19 0
|
算法 C++ 容器
剑指Offer - 面试题40:最小的k个数
剑指Offer - 面试题40:最小的k个数
40 0
剑指offer 46. 把数组排成最小的数
剑指offer 46. 把数组排成最小的数
60 0
剑指offer_数组---把数组排成最小的数
剑指offer_数组---把数组排成最小的数
39 0
剑指offer_数组---最小的K个数
剑指offer_数组---最小的K个数
38 0
Leecode面试题40. 最小的k个数
Leecode面试题40. 最小的k个数
50 0
|
算法
LeetCode 面试题 17.14. 最小K个数
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
64 0