题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4.
解题思路:
用最大堆保存这k个数,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆。(本题考查的是最大堆的实现)
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;
while(i<input.size())
{
if(input[0]>input[i])
{
int temp=input[i];
input[i]=input[0];
input[0]=temp;
adjustHeap(input,0,k);
i=k;
}
else
{
i++;
}
}
for(int i=0; i < k; i++)
{
result.push_back(input[i]);
}
return result;
}
void adjustHeap(vector<int>&input,int i,int length)//堆调整
{
int root = i;
int child = root*2 + 1;
if(child < length)
{
if( child+1 < length && input[child+1] > input[child])
{
child=child+1;
}
if(input[child]>input[root])
{
input[root] = input[root]^input[child];
input[child] = input[root]^input[child];
input[root] = input[root]^input[child];
adjustHeap(input, child, length);
}
}
}
};