版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuweiyuxiang/article/details/85996524
有关set和multi的介绍和API参考:【C++ STL学习之五】容器set和multiset
在这里分享一个使用multiset容器的剑指offer上的面试题最小的K个数。
题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if (input.size() < k || k < 1)
return vector<int>();
multiset<int, greater<int> > minK;
vector<int>::iterator itea = input.begin();
for (; itea != input.end(); ++itea){
if (minK.size() < k){
minK.insert(*itea);
}
else{
multiset<int, greater<int>>::iterator mitea = minK.begin();
if (*itea < *mitea){
minK.erase(mitea);
minK.insert(*itea);
}
}
}
return vector<int>(minK.begin(), minK.end());
}
};
还有一种使用C++优先队列的方法:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if (input.size() < k || k < 1)
return vector<int>(); //原来是 return intput;不能AC
priority_queue<int, vector<int>, less<int> > pq; //大顶堆
for (int i = 0; i < input.size(); i++){
if (pq.size() < k){
pq.push(input[i]);
}
else{
int max = pq.top();
if (input[i] < max){
pq.pop();
pq.push(input[i]);
}
}
}
vector<int> v;
while (!pq.empty()){
v.push_back(pq.top());
pq.pop();
}
return v;
}
};
有关优先队列的内容请移步C++中两种实现堆的方式:make_heap和priority_queue.