题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
思路:可以采用快速排序,也可以采用堆排序(尤其适合动态的排序和海量数据排序)
下面提供堆排序代码,采用STL中的堆排序。
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int len = input.size();
if(len <=0 || k>len)
return vector<int>();
vector<int> res(k+1);
/*将input中元素全部拷贝到res开始的位置中,注意拷贝的区间为input.begin() ~ input.end()的左闭右开的区间*/
res.assign(input.begin(),input.begin()+k);
//实际编程需要包含头文件<algorithm>建堆,默认创建的是最大堆,堆顶为首元素,若要创建最小堆,第三个参数为greater<int>()
make_heap(res.begin(),res.end());
for(int i=k;i<len;i++){
if(input[i]<res[0]){
res.push_back(input[i]);
push_heap(res.begin(),res.end());
pop_heap(res.begin(),res.end());
res.pop_back();
}
}
return res;
}
};
或者直接采用priority_queue
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int len = input.size();
if(len <=0 ||k<=0 || k > len) //注意K的范围,之前一直编译不过,就是因为漏掉了k<=0
return vector<int>();
priority_queue<int> heap;
for(int i=0;i<k;i++)
heap.push(input[i]);
for(int i=k;i<len;i++){
if(input[i] < heap.top()){
heap.pop();
heap.push(input[i]);
}
}
vector<int> result(k);
for(int i=k-1;i>=0;i--){
result[i] = heap.top();
heap.pop();
}
return result;
}
};