Top K
https://blog.csdn.net/wufaliang003/article/details/82940218
https://blog.csdn.net/hefenglian/article/details/81807527
选择最大的K个数
用PriorityQueue默认是自然顺序排序,要选择最大的k个数,构造小顶堆,每次取数组中剩余数与堆顶的元素进行比较,如果新数比堆顶元素大,则删除堆顶元素,并添加这个新数到堆中。
public class findTopK { //找出前k个最大数,采用小顶堆实现 public static int[] findKMax(int[] nums, int k) { PriorityQueue<Integer> pq = new PriorityQueue<>(k);//队列默认自然顺序排列,小顶堆,不必重写compare for (int num : nums) { if (pq.size() < k) { pq.offer(num); } else if (pq.peek() < num) {//如果堆顶元素 < 新数,则删除堆顶,加入新数入堆 pq.poll(); pq.offer(num); } } int[] result = new int[k]; for (int i = 0; i < k&&!pq.isEmpty(); i++) { result[i] = pq.poll(); } return result; } public static void main(String[] args) { int[]arr=new int[]{1, 6, 2, 3, 5, 4, 8, 7, 9}; System.out.println(Arrays.toString(findKMax( arr,5))); } } /** 输出:[5, 6, 7, 8, 9] */
选择最小的K个数
选择最小的k个数可以用冒泡排序,复杂度为O(n*k),有点高。
要选择最小的K个数使用大顶堆,每次取数组中剩余数与堆顶的元素进行比较,如果新数比堆顶元素小,则删除堆顶元素,并添加这个新数到堆中。
public class findTopK { ////要找前k个最小数,则构建大顶堆,要重写compare方法 public static int[] findKMin(int[] nums, int k) { PriorityQueue<Integer> pq = new PriorityQueue<>(k, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2-o1; } }); for (int num : nums) { if (pq.size() < k) { pq.offer(num); } else if (pq.peek() > num) {//如果堆顶元素 > 新数,则删除堆顶,加入新数入堆 pq.poll(); pq.offer(num); } } int[] result = new int[k]; for (int i = 0; i < k&&!pq.isEmpty(); i++) { result[i] = pq.poll(); } return result; } public static void main(String[] args) { int[]arr=new int[]{1, 6, 2, 3, 5, 4, 8, 7, 9}; System.out.println(Arrays.toString(findKMin( arr,5))); } } /** 输出:[5, 4, 3, 2, 1] */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)