堆的相关习题 ​​​​​​​面试题17.14、最小的K个数 ​​​​​​​347、前K个高频元素 373、查找和最小的K对数字

本文介绍了三种使用优先级队列(最大堆)解决不同场景下的K个最小元素问题:最小的K个数、前K个高频元素以及查找和最小的K对数字。通过构建最大堆,可以高效地找到数组中指定数量的最小元素或满足特定条件的元素组合。
摘要由CSDN通过智能技术生成

目录

面试题17.14、最小的K个数 - 力扣 ​​​​​​​

347、前K个高频元素 - 力扣  

373、查找和最小的K对数字 - 力扣​​​​​​​


​​​​​​​面试题17.14、最小的K个数 - 力扣 ​​​​​​​ 

思路:首先根据题目条件取最小的数构造最大堆,遍历原数组,若当前元素个数大于K,判断K和堆顶元素的关系,若当前元素大于堆顶元素,则大于堆中所有元素,当前元素不入堆;若当前元素小于K ,将堆顶元素出堆,当前元素入堆。最后将堆中保存的元素出堆保存在数组中。

//最小的K个数,取小用大
class Num17_14_SmallestK {
    public int[] smallestK(int[] arr,int k) {
        //边界条件
        if (arr.length == 0 || k == 0) {
            return new int[0];
        }
        //构造一个最大堆。JDK默认的是最小堆,使用比较器改造为最大堆
        Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        //扫描原数组,优先级队列中只存储K个数
        for(int i : arr) {
            if (queue.size() < k) {
                queue.offer(i);
            }else {
                //当前元素超过了k值,判断扫描元素和堆顶的关系
                //若扫描元素 > 堆顶元素,则 > 堆中所有元素,扫描元素不入堆
                int peek = queue.peek();//堆顶元素
                if (i > peek) {
                    continue;
                }else {
                    //此时扫描元素 < 堆顶元素,将堆顶元素出队,再将此元素入堆
                    queue.poll();
                    queue.offer
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘻嘻-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值