題目:求輸入n個整數中最小的k個數。
思路:
1、特殊情況判斷,如果輸入數組爲空,或者k大於給定數組長度的,那麼輸出爲空。
2、正常情況下,這道題目應該通過構建最小堆算法來實現的,但由於最小堆本身實現比較複雜,在面試的短短几十分鐘內很難完成,因此我們在徵求面試官的同意後使用stl中的multiset(因爲可能出現重複元素)。multiset是基於紅黑色的,且元素在其中是自動排序的,因而我們可以很方便的實現。
這裏需要說明的是:multiset默認是multiset<int,less<int> > ,即可以理解爲默認爲最小堆,而有些情況下需要設置multiset<int,greater<int> >,這表示其是最大堆,即它的根元素是最大的。
class Solution {
public:vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if(input.empty()||k>input.size()){
return res;
}
multiset<int> temp;
for(int i=0;i<input.size();i++){
temp.insert(input[i]);
}
int m=0;
for(multiset<int>::iterator start=temp.begin();m<k;start++,m++){
res.push_back(*start);
}
return res;
}
};