牛客网刷题|最小的K个数

题目来源:牛客网
编程连接

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

题目解析:

很容易想到先排序,之后取前K个树即可,但是得排除总数没有K个得情况
1、直接用sort排序
2、那么用multiset(不能用set,set会去重)和priority_queue也是可以做的,一个基于红黑树实现,一个基于堆实现。


(set和multiset 会根据特定的排序准则,自动将元素排序。)


priority_queue 优先队列,其底层是用堆来实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个。
在优先队列中,没有 front() 函数与 back() 函数,而只能通过 top() 函数来访问队首元素(也可称为堆顶元素),也就是优先级最高的元素。
此处指的基本数据类型就是 int 型,double 型,char 型等可以直接使用的数据类型,优先队列对他们的优先级设置一般是数字大的优先级高,因此队首元素就是优先队列内元素最大的那个(如果是 char 型,则是字典序最大的)。

//下面两种优先队列的定义是等价的

priority_queue q;
priority_queue,less >;//后面有一个空格

其中第二个参数( vector ),是来承载底层数据结构堆的容器,第三个参数( less ),则是一个比较类,less 表示数字大的优先级高,而 greater 表示数字小的优先级高。

如果想让优先队列总是把最小的元素放在队首,只需进行如下的定义:priority_queue,greater >q;

sort代码:

运行时间:2ms;占用内存:480k

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> ret;
        if(k > input.size())
            return ret;
        sort(input.begin(),input.end());

        for(int i = 0;ireturn ret;       
    }
};

multiset 代码:

multiset 运行时间:4ms;占用内存:512k

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> ret;
        if(k > input.size())
            return ret;
        multiset<int> mse;
        for(auto it = input.begin();it!=input.end();mse.insert(*it++) );
        for(auto it = mse.begin();k--;ret.push_back(*it++));
        return ret;       
    }
};

优先队列代码:

运行时间:5ms;占用内存:580k

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int>ret;
        if(k > input.size())
            return ret;
        priority_queue<int,vector<int>,greater<int> >q;
        for(auto it = input.begin();it!=input.end();q.push(*it++));
        for(;k--;ret.push_back(q.top()),q.pop());
        return ret;      
    }
};

你可能感兴趣的:(刷题-从零开刷)