最小的K个数(剑指offer-29)
2024-10-09 03:22:07
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
题目解析
大小为 K 的最小堆
复杂度:O(NlogK) + O(K),特别适合处理海量数据。
应该使用大顶堆来维护最小堆,而不能直接创建一个小顶堆并设置一个大小,企图让小顶堆中的元素都是最小元素。
维护一个大小为 K 的最小堆过程如下:在添加一个元素之后,如果大顶堆的大小大于 K,那么需要将大顶堆的堆顶元素去除。
题目解答
import java.util.*;
public class A03 {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
if (k > input.length || k <= 0)
return new ArrayList<>();
//lambda表达式,Comparator比较器,相当于一个可以自动排序的队列。
//PriorityQueue默认是一个小顶堆,然而可以通过传入自定义的Comparator函数来实现大顶堆。
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);
for (int num : input) {
maxHeap.add(num);
if (maxHeap.size() > k)
maxHeap.poll();
}
return new ArrayList<>(maxHeap);
}
}
最新文章
- java基础 绘图技术.坦克大战 之java绘图坐标体系(二)
- Sublime Text 2 增加python版本
- HTTP 状态代码表示什么意思?
- sublime text 3 安装
- T4 模板的调试方法,方便大家遇到问题自己快速定位和优化
- javascript 递归调用
- iOS开发-自动布局和自动旋转
- js冒泡事件小解
- Project下载提示检索 COM 类工厂中 CLSID 为 {36D27C48-A1E8-11D3-BA55-00C04F72F325} 的组件失败
- Java基础 -- 持有对象(容器)
- 2018-2019-2 网络对抗技术 20165231 Exp3 免杀原理与实践
- 多线程——multiprocess
- 第九届蓝桥杯C/C++B组省赛感想
- java 基础响应体定义 - 通用
- 关于交叉熵(cross entropy),你了解哪些
- ubuntu中文版man
- [EXP]Microsoft Windows MSHTML Engine - ";Edit"; Remote Code Execution
- 微信小程序页面带参数跳转及接收参数内容navigator
- 【IT笔试面试题整理】位操作
- angular使用遇到的问题
热门文章
- EasyARM-iMX257 linxu两年前的笔记
- AbstractCollection类中的 T[] toArray(T[] a)方法源码解读
- Crypto++ AES 加密解密流程
- EIGRP-11-弥散更新算法-EIGRP中的本地计算和弥散计算
- MySQL 性能优化之慢查询
- 11.实战交付一套dubbo微服务到k8s集群(3)之dubbo微服务底包镜像制作
- 使用addEventListener绑定事件是关于this和event记录
- MOJITO 发布一周,爬一波弹幕分析下
- MDX
- opencv c++访问某一区域