【算法】使用大根堆,解决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);
}
相关文章推荐
- Java使用递归解决算法问题的实例讲解
- 算法第三节:使用递归算法解决“阶乘”问题
- 韩顺平_PHP程序员玩转算法公开课(第一季)05_使用单链表解决约瑟夫问题_学习笔记_源代码图解_PPT文档整理
- C语言使用深度优先搜索算法解决迷宫问题(堆栈)
- PHP使用栈解决约瑟夫环问题算法示例
- 使用 STL 辅助解决算法问题
- 我是怎么使用最短路径算法解决动态联动问题的
- jni使用openssl AES256位加解密(cbc模式),匹配java后端服务器算法,解决末尾乱码问题
- 算法研究之解决全排列问题:使用深度优先搜索(DFS)
- 待解决问题:验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate
- 算法——使用递归解决组合问题
- 算法研究--使用 红黑树 解决实际问题(理论与实践)
- 大雾课论文《浅谈简单使用计算机与算法快速解决物理问题》
- JAVA使用回溯法解决n皇后问题的算法
- 算法基础-使用循环不变式解决插入排序问题
- jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
- 使用matlab实现遗传算法解决飞行员侦查问题
- 2-bitmap 算法,可解决海量数据问题,减少内存使用
- 使用三种算法解决从键盘输入两个整数,输出两个整数的最大公约数的问题
- 关于在struts 框架中使用Filter过滤器解决汉字编码问题