博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《剑指 Offer》——29、最小的K个数
阅读量:2343 次
发布时间:2019-05-10

本文共 1190 字,大约阅读时间需要 3 分钟。

1. 本题知识点

2. 题目描述

输入 n 个整数,找出其中最小的 K 个数。例如输入 4,5,1,6,2,7,3,8 这 8 个数字,则最小的 4 个数字是 1,2,3,4。

3. 解题思路

建立一个容量为 k 的最大堆的优先队列。遍历一遍元素,如果队列大小 < k,就直接入队,否则,让当前元素与队顶元素相比,如果队顶元素大,则出队,将当前元素入队。

4. 代码

public class Solution {
public ArrayList
GetLeastNumbers_Solution(int[] input, int k) {
ArrayList
list = new ArrayList<>(); // k 不能大于数组长度或者小于等于 0 if (k > input.length || k <= 0) {
return list; } // 最大堆 PriorityQueue
priorityQueue = new PriorityQueue<>(Collections.reverseOrder()); // 遍历数组构建最大堆 for (int i : input) {
// 当最大堆元素个数小于 k 时,直接入队 if (priorityQueue.size() < k) {
priorityQueue.offer(i); } else {
// 否则,让当前元素和与根比较,如果如果根大于当前元素,则根出队,当前元素入队 if (priorityQueue.peek() > i) {
priorityQueue.poll(); priorityQueue.offer(i); } } } // 将最大堆根元素逐个输出 while (priorityQueue.peek() != null) {
list.add(priorityQueue.poll()); } // 反转顺序 Collections.reverse(list); return list; }}

转载地址:http://mbjvb.baihongyu.com/

你可能感兴趣的文章
Copy_from&to_user详解
查看>>
你什么时候使用Builder模式? [关闭]
查看>>
在jQuery中每5秒调用一次函数的最简单方法是什么? [重复]
查看>>
Angular 2+中的ngShow和ngHide等效于什么?
查看>>
如何将Java String转换为byte []?
查看>>
@Transactional注释在哪里?
查看>>
找不到Gradle DSL方法:'runProguard'
查看>>
AngularJS ngClass条件
查看>>
为什么需要在脚本文件的开头加上#!/ bin / bash?
查看>>
ReactJS-每次调用“ setState”时都会调用渲染吗?
查看>>
ng-if和ng-show / ng-hide有什么区别
查看>>
用Java复制文件的标准简洁方法?
查看>>
管理webpack中的jQuery插件依赖项
查看>>
删除可能不存在的文件的大多数pythonic方式
查看>>
如何在Eclipse中为Java文本编辑器更改字体大小?
查看>>
我们应该@Override接口的方法实现吗?
查看>>
ng-repeat定义次数而不是重复数组?
查看>>
选择语句以查找某些字段的重复项
查看>>
JavaScript ES6类中的私有属性
查看>>
默认情况下,如何以管理员身份运行Visual Studio?
查看>>