您的位置:首页 > 运维架构

【算法】使用大根堆,解决top_k问题

2017-09-06 16:18 253 查看


题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

public static ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list=new ArrayList<Integer>();
if(input==null || input.length<k||input.length<=0 ){
return list;
}
for(int len=(input.length-1)/2; len>=0; len--){
adjustBigHeap(input,len,input.length-1);//初始化建大根堆
}

int tmp;
for(int i=input.length-1; i>0; i--){
//第一个元素交换到最后,重新调整为大根堆
tmp=input[0];
input[0]=input[i];
input[i]=tmp;
adjustBigHeap(input,0,i-1);

}
for(int j=0; j<k; j++){
list.add(input[j]);
}
return list;
}

public static void adjustBigHeap(int[] input, int begin, int length){
int temp;
int child;
for(temp=input[begin]; 2*begin+1<=length; begin=child){//从begin元素向下查找
child=2*begin+1;
if(child<length && input[child]<input[child+1]){//找到孩子中大的
child++;
}
if(input[child]>temp){
input[begin]=input[child];
}else{
break;
}
}
input[begin]=temp;
}
public static void main(String[] args) {
int arr[]={2,3,5,6,1,4,7,8,9};
ArrayList<Integer>a= GetLeastNumbers_Solution(arr,4);
System.out.println(a);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐