这是LeetCode中的剑指offer的题目,原题目如下陈述:
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
这类问题我们称之为topK问题,也是给你一堆的数,你来找到其中最小的K个,或者最大的K个数据,输入就是数组,还有K个
算法思想:
使用JAVA语言解题十分的方便,因为java语言中有priorityqueue的大根堆与小根堆数据结构,其内部是有完全二叉树进行实现的,固定长度的K,自动进行排序。进行删除堆顶与堆底部的操作。但是由于java语言中的priorityqueue默认是使用
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
if(k==0){
return new int[0];
}//规定的K为0,最终的输出的数组大小为null
Queue<Integer> heap = new PriorityQueue<Integer>(k,(i1,i2)->Integer.compare(i2,i1)); //di
for (int e : arr) {
// 当前数字小于堆顶元素才会入堆
if (heap.size() < k || e < heap.peek()) {
heap.offer(e);
}
if (heap.size() > k) {
heap.poll(); // 删除堆顶最大元素
}
}
int[] res =new int[heap.size()];
int j=0;
for(int e:heap){
res[j++]=e;
}
return res;
}
}
在整个的代码中的核心思想在利用java中的大根堆,java中默认是小根堆,大根堆需要重写一下比较器,每次将最大的数进行输出。
数组的数中满足堆不没有满的时候,且数组的数比heap.peek()要小的时候,送入堆中,使得最终的堆中只有最小的数,将其转化为数组输出。
快排的算法需要将进行变形,将其改写为快速选择的算法,进行选择,有兴趣的读者可以自己试试,欢迎评论区留言!