C++之容器set和multiset
阿新 • • 發佈:2019-01-07
有關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.