题解 | #最小的K个数#

最小的K个数

https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf

//使用了堆排序的思路。不是构建一个最小堆,把所有数据排完序后取前K个,而是构建一个最大堆,只保存k个数,这个最小堆我们视它为当前暂时筛选出来的k个最小数。如果有哪个数比这k个最小数中的最大的那个小,就相当于拥有了进入这个最小堆的权力。堆中的最大的这个数我们可以看成是“门槛”。它进来后可以把原本的门槛取而代之。
//如果要求你写的是“最大的K个数”,也没多少要改的,只需要把priority_queue中的第三个模板参数设置为greater(默认用的是less构建大根堆),以构建最小堆来保存最大的k个数。
//找最大的k个数用最小堆,找最小的k个数用最大堆,看起来很矛盾,但实际上这是因为我们并不是对整个数组进行排序,而只是为了在迭代过程中,找到临时筛选出的“topK”里的那个“门槛”,用这个门槛和数组中其他元素进行比较,来迭代整个“topK”的小集合而已。
#include <functional>
#include <queue>
#include <vector>
class Solution {
  public:
    vector<int> GetLeastNumbers_Solution(vector<int>& input, int k)
    {
        //return GetBiggestNumbers_Solution(input, k);
        return GetSmallestNumbers_Solution(input, k);
    }

    vector<int> GetSmallestNumbers_Solution(vector<int>& input, int k) {
        priority_queue<int>q;
        stack<int>temp;
        vector <int>result;
        if (input.size() < k || k <= 0)return result;
        for (int i = 0; i < k; i++) {
            q.push(input[i]);
        }
        for (int i = k; i < input.size(); i++) {
            if (input[i] <
                    q.top()) { //如果当前这个数,比我们目前筛选出来的k个最小值中的最大的那个更小,就说明它可以取而代之。
                q.pop();
                q.push(input[i]);
            }
        }
        while (!q.empty()) {
            temp.push(q.top());
            q.pop();
        }
        while (!temp.empty()) {
            result.push_back(temp.top());
            temp.pop();
        }
        return result;
    }
    vector<int> GetBiggestNumbers_Solution(vector<int>& input, int k) {
        priority_queue<int, vector<int>, greater<> >q;//构建一个最小堆
        stack<int>temp;
        vector <int>result;
        if (input.size() < k || k <= 0)return result;
        for (int i = 0; i < k; i++) {
            q.push(input[i]);
        }
        for (int i = k; i < input.size(); i++) {
            if (input[i] >
                    q.top()) { //如果当前这个数,比我们目前筛选出来的k个最大值中的最小的那个更大,就说明它可以取而代之。
                q.pop();
                q.push(input[i]);
            }
        }
        while (!q.empty()) {
            temp.push(q.top());
            q.pop();
        }
        while (!temp.empty()) {
            result.push_back(temp.top());
            temp.pop();
        }
        return result;
    }
};

全部评论

相关推荐

专心打鱼:互联网搬运工,贴子都要偷
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务