1. 程式人生 > >C++之容器set和multiset

C++之容器set和multiset

有關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.