C++之容器set和multiset

版权声明:本文为博主原创文章,未经博主允许不得转载。 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.

猜你喜欢

转载自blog.csdn.net/liuweiyuxiang/article/details/85996524
今日推荐