题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解析:
1、全排序,从小到大取前k个数即可。
代码:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> result;
int length=input.size();
if(length<k)
return result;
if(length==k)
return input;
sort(input.begin(),input.end());
for(int i=0;i<k;i++){
result.push_back(input[i]);
}
return result;
}
};
2、堆排序
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
/*vector<int> result;
int length=input.size();
if(length<k)
return result;
if(length==k)
return input;
sort(input.begin(),input.end());
for(int i=0;i<k;i++){
result.push_back(input[i]);
}
return result;*/
vector<int> result;
int length=input.size();
if(length<k)
return result;
if(length==k)
return input;
heapSort(input,length);
for(int i=0;i<k;i++)
result.push_back(input[i]);
return result;
}
//大根堆调整,inout[top...n-1]
void adjustHeap(vector<int> &input,int top,int n){
//n为堆中元素总数
int j=2*top+1;//根节点i的左孩子
int temp=input[top];
while(j<n){
if(j<n-1&&input[j]<input[j+1])
j++;//使j指向左右孩子中较大者
if(input[j]<=temp)
break;
else{//根节点中元素与左右孩子节点中较大者交换:input[j]大时向上提升
input[top]=input[j];
top=j;
j=2*top+1;
}
}
input[top]=temp;
}
//堆排序,从小到大,n为堆中元素总数
void heapSort(vector<int> &input,int n){
for(int i=n/2-1;i>=0;i--)//初始化堆
adjustHeap(input,i,n);
for(int i=n-1;i>0;i--){
int temp=input[0];
input[0]=input[i];
input[i]=temp;
adjustHeap(input,0,i);
}
}
};
3.
,用前K个数建立最大堆,每次用堆顶元素和n-k中各个元素比较,如果堆顶元素较大,则互换位置,然后调整堆,使之重新成为最大堆。时间复杂度O(n*logk)
//大根堆调整,inout[top...n-1]
void adjustHeap(vector<int> &input,int top,int n){
int j=2*top+1;//j指向左子节点
int temp=input[top];
while(j<n){
if(j<n-1&&input[j]<input[j+1]){
j=j+1;
}
if(temp<input[j]){
input[top]=input[j];
top=j;
j=2*top+1;
}
else break;
}
input[top]=temp;
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> result;
int length=input.size();
if(length<k)
return result;
if(length==k)
return input;
adjustHeap(input,0,k);//input的前k个数调整成最大堆
for(int i=k;i<length;++i){
if(input[i]<input[0]){
int t=input[0];
input[0]=input[i];
input[i]=t;
adjustHeap(input,0,k);
}
}
for(int i=0;i<k;++i)
result.push_back(input[i]);
return result;
}