最小的K个数 java实现 剑指offer
2017-06-04 09:54
363 查看
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思想:
原来的做题思路是直接快速排序法排一遍,在取出这最小的K个数,可行,但是有些排序多余了,因为这边只要找到最小的K个数,快排的话会整体排一遍,次数可能大于K次,所以这边采用最小堆排序的方法,只需要排k次即可取出最小的K个数。
import java.util.*;
public class Solution {
private int[] data;
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list=new ArrayList<Integer>();
data=input;
int len=input.length;
int end=len-1;
if(k>end+1||k==0)//特殊情况,输入的K为0或者k>数组长度
return list;
for(int i=0;i<k;i++){
createMinHeap(end-i);
swap(0,end-i);
list.add(data[end-i]);
}
return list;
}
public void createMinHeap(int end){
if(end==0) return;
int index=(end-1)/2;
for(int i=index;i>=0;i--){//每次循环找出一棵树中最小的值,并将这个值放在根节点处
int k=i;
int smaller=data[i];
if(2*i+1<=end){
if(data[2*i+1]<smaller){//左节点存在
k=2*i+1;
smaller=data[2*i+1];
}
if(2*i+1<end){//右节点存在
if(data[2*i+2]<smaller)
k=2*i+2;
}
}
if(k!=i) swap(i,k);
}
}
public void swap(int n1,int n2){
int temp=data[n1];
data[n1]=data[n2];
data[n2]=temp;
}
}
相关文章推荐
- 《剑指offer》java实现 输入n个数,找到其中最小的K个数
- 《剑指offer》编程题java实现(十五):旋转数组的最小值
- 剑指Offer:面试题30——最小的k个数(java实现)
- JAVA实现旋转数组的最小数字问题(《剑指offer》)
- 剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)
- 剑指Offer:面试题8——旋转数组的最小值(java实现)
- 剑指Offer面试题33:把数组排成最小的数 Java 实现,三种方法
- JAVA实现旋转数组的最小数字问题(《剑指offer》)
- 最小生成树算法——Kruskal算法Java实现
- prim 最小生成树算法 java实现
- prim 最小生成树算法 java实现
- java实现——030最小的k个数
- 单源最短路径、最小生成树及堆的Java实现
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径
- java实现——008旋转数组的最小数字
- java代码--实现随机输出10个随机数,并显示最大值,最小值
- Java获取一维数组的最小值实现方法
- 最小操作数-Java实现
- 最小生成树的Prim算法和Kruskal算法java代码实现
- 最小最大堆(双端堆)的实现(Java版)