题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
private :
vector <int>heap;
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
for(int i=0;i<input.size();i++){
if(i<k){
buildMaxHeap(input[i]);
}
else if(input[i]<heap[0]){
adjustMaxHeap(input[i]);
}
}
sort(heap.begin(),heap.end());
for (int i=0;i<heap.size();i++){
cout<<" "<<heap[i];
}
cout<<endl;
return heap;
}
//创建一个最大堆 用于存放k个最小值
void buildMaxHeap(int num){
heap.push_back(num);
int current_index = heap.size()-1;
while (current_index!=0){
int parent_index = (current_index-1)/2;
if(heap[parent_index]<heap[current_index]){
int tmp = heap[parent_index];
heap[parent_index]=heap[current_index];
heap[current_index]=tmp;
current_index=parent_index;
// cout<<" build index:"<<current_index<<endl;
}
else{
break;
}
}
}
void adjustMaxHeap(int num){
heap[0]=num;
int len=heap.size();
int index=0;
while(index<len){
int large_index;
int left_index=index*2+1;
int right_index=index*2+2;
// cout<<" index:"<<index<<endl;
if(right_index<len){
if(heap[left_index]<heap[right_index]){
large_index=right_index;
}
else {
large_index=left_index;
}
}
else if(left_index<len){
large_index=left_index;
}
else{
break;
}
if(heap[index]<heap[large_index]){
int tmp = heap[large_index];
heap[large_index]=heap[index];
heap[index]=tmp;
}
index=large_index;
}
}
};
int main()
{
vector <int> test{4,5,1,6,2,7,3,8};
Solution so;
so.GetLeastNumbers_Solution(test,4);
}