【题目】
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
【思路】
用最大堆保存这k个数,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆。
【代码】
public static void main(String[] args) {
int[] numbs = {4,5,1,6,2,7,3,8};
System.out.println(getLeastK(numbs,4));//[1, 2, 3, 4]
}
//最小的k个数
public static ArrayList<Integer> getLeastK(int[] nums,int k){
if(nums==null||k<=0||k>nums.length){
return null;
}
ArrayList<Integer> list=new ArrayList<Integer>();
//优先级队列默认为小顶堆,改为大顶堆(从大到小排序)
PriorityQueue<Integer> queque=new PriorityQueue<Integer>(k,new Comparator<Integer>(){
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
for(int i=0;i<nums.length;i++){
if(queque.size()!=k){
queque.offer(nums[i]);
}
else{
if(nums[i]<queque.peek()){ //取出元素,(不删除)
queque.poll(); //取出元素,(删除)
queque.offer(nums[i]); // 添加元素
}
}
}
while(!queque.isEmpty()){
list.add(queque.poll());
}
Collections.reverse(list);//[4, 3, 2, 1]
return list; //[1, 2, 3, 4]
}
本文介绍了一种使用最大堆的数据结构来找出给定数组中最小的K个数的方法。通过维护一个大小为K的最大堆,可以高效地找到这些数。文章提供了一个具体的Java实现示例。
4301

被折叠的 条评论
为什么被折叠?



