最小的K个数
最小的K个数
题目描述:
输入整数数组
arr,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
题目思路:
一、冒泡排序
排序方法太多了,从小到大排序,然后取前K个值。
public int[] getLeastNumbers(int[] arr, int k) {
int[] res = new int[k];
//排序以后取K个
for (int i = 0; i < arr.length; i++) {
for (int j = i+1; j < arr.length ; j++) {
if (arr[i] > arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.arraycopy(arr,0,res,0,k);
return res;
}
二、堆
堆的数量为k
依次入堆,当堆满时就弹出最大的数字
剩下的就是最小的k个数
if (k == 0){
return new int[0];
}
// 使用一个大顶堆
// java的priorityQueue默认是小顶堆,添加comparator参数使其变成最大堆
Queue<Integer> heap = new PriorityQueue<>((o1, o2) -> Integer.compare(o2, o1));
for (int e : arr) {
// 当前元素小于堆顶元素才会入堆
if (heap.isEmpty() || 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;

浙公网安备 33010602011771号