题目来源:牛客网
编程连接
题目描述
输入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<int> q;
priority_queue<int,vector<int>,less<int> >;//后面有一个空格其中第二个参数( vector ),是来承载底层数据结构堆的容器,第三个参数( less ),则是一个比较类,less 表示数字大的优先级高,而 greater 表示数字小的优先级高。
如果想让优先队列总是把最小的元素放在队首,只需进行如下的定义:
priority_queue<int,vector<int>,greater<int> >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;i<k;i++)
{
ret.push_back(input[i]);
}
return 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;
}
};