题解 | #最小的K个数#

最小的K个数

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

1.直接用cmath里面sort()排序
直接排序输入数组,
返回最小的k个

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        sort(input.begin(),input.end());
        vector<int> res;
        if(k>input.size()) return res;
        for(int i=0;i<k;++i) res.push_back(input[i]);
        return res;
    }
};

2.用优先级队列实现堆排序
优先级队列首先是个队列,这里有点public继承的味道,is-a的关系
所以,队列特有“先进先出”
优先级显然大的在前
这边用常值int变量 val来遍历输入数组input, const int val:input,
让人想到python遍历的样子。
首先少于k,就直接入队
大等于k,审核入队,只有比队首最大的小,这是个大顶堆,可以来输出最小的几个值,
举一反三,如果是最大的几个值,应该是用小顶堆,如果有比最小值大的,val>pq.top(),则入队
输出采用了同类型的ret来存放

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> ret;
        if(k==0 || k>input.size()) return ret;
        priority_queue<int,vector<int>>pq;//自动从大到小排序的队列
        for(const int val:input) {//让val遍历input
            if(pq.size()<k){
                pq.push(val);
            }else{
                if(val<pq.top()){
                    pq.pop();
                    pq.push(val);
                }
            }
        }
        while(!pq.empty()){
            ret.push_back(pq.top());
            pq.pop();
        }
        return ret;
    }
};
全部评论

相关推荐

07-10 11:08
门头沟学院 Java
Sairus:我注册都注册不了提醒我手机号二次啥的,果然对于人才推得就是快,像我投完了就没回音的
投递京东等公司10个岗位
点赞 评论 收藏
分享
06-26 15:33
青岛工学院 Java
积极的秋田犬要冲国企:他现在邀请我明天面试
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 15:58
投个小米提前批试试水,先投一个岗位看看形势,不行就再沉淀一下投第二个岗位,莫辜负
Java抽象带篮子:我嘞个骚刚,已经开始研发6g了吗
投递小米集团等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务