题目描述
输入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) {
vector<int> result;
if(input.size()==0||k==0||k>input.size()){
return result;
}
for(int i=input.size()/2-1;i>=0;i--){//初始化堆
adjustHeap(input,i,k);
}
int i=k;
//调用堆排序函数
heapSort(input,input.size());
//输出前k个
for(int i=0;i<k;i++){
result.push_back(input[i]);
}
return result;
}
void adjustHeap(vector<int>&input,int i,int length){//堆调整
int child=i*2+1;
if(child<length){
if(child+1<length&&input[child+1]>input[child]){
child=child+1;
}
if(input[child]>input[i]){
int temp=input[i];
input[i]=input[child];
input[child]=temp;
adjustHeap(input,child,length);
}
}
}
void heapSort(vector<int>&input,int length){//堆排序
for(int i=length/2-1;i>=0;i--){//初始化堆
adjustHeap(input,i,length);
}
for(int i=length-1;i>0;i--){
int temp=input[i];
input[i]=input[0];
input[0]=temp;
adjustHeap(input,0,i);
}
}
};
还有一种简洁的方法,直接调用sort()函数。(不过这个应该不太好)
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> v;
if(k>input.size())
return v;
sort(input.begin(),input.end());
for(int i=0;i<k;i++)
v.push_back(input[i]);
return v;
}
};