【LeetCode】八、堆的使用:第K个最大元素 + 前K和高频单词

文章目录

  • 1、Java中的堆结构
  • 2、leetcode215:数组中的第K个最大元素
  • 3、leetcode692:前K个高频单词

1、Java中的堆结构

  • PriorityQueue类
  • 取堆顶元素
  • 删除堆顶元素
  • 堆的元素个数
  • 遍历堆

在这里插入图片描述

2、leetcode215:数组中的第K个最大元素

在这里插入图片描述
这题应该快排来解,这里用堆仅做练习。用堆实现的思路:将数组存入最大堆,k=1,找第一大的元素,则取堆顶元素,k=2,找第二大的元素,则删掉堆顶元素,取最新的堆顶元素,k=3,则删掉两次堆顶元素后,取新的堆顶元素

public class P215 {

    public static int getKMax(int[] array, int k) {
        if (array == null || array.length == 0 || k < 1){
            return Integer.MIN_VALUE;
        }
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
        for (int i : array) {
            maxHeap.add(i);
        }
        while (k > 1) {
            // 删掉前面第k-1大的所有元素
            maxHeap.poll();
            k--;
        }
        // 取出删掉后新的堆顶元素,即第K大的元素
        return maxHeap.peek();
    }
}

测试:

public class P215 {
    public static void main(String[] args) {
        int[] array = {3, 2, 3, 1, 2, 4, 5, 5, 6};
        System.out.println(getKMax(array, 4));
    }
}

在这里插入图片描述

3、leetcode692:前K个高频单词

在这里插入图片描述

本质是个统计次数的问题,自然想到哈希表结构,可用HashMap,统计完后,前k个、第K个,则可考虑最大堆。不过,题中要求次数相等时,按照字母排序,因此,要自定义比较器的实现:先比次数,次数相等再按字母排序

在这里插入图片描述

如果要用最小堆实现:应该将值最小的元素往堆顶放、同等次数的把字母靠后的往堆顶放

在这里插入图片描述

然后,限制最小堆里元素的个数为k个,当超出k时,剔除堆顶元素,因为堆顶元素最小,我要的是前K大的。遍历map完成后,从堆中循环取出堆顶数据,此时得到的顺序是从小到大的,再反转下,即可return

在这里插入图片描述

这里用最小堆和最小堆分别来解决:

public class P692 {

    /**
     * 统计每个单词出现的数量
     */
    public static HashMap<String, Integer> stats(String[] array) {
        if (array == null || array.length == 0) {
            return null;
        }
        HashMap<String, Integer> statsMap = new HashMap<>();
        for (String str : array) {
            // 判断下是否包含这个key,不要直接map.get(str) + 1
            // 没这个key时,get返回null,null + 1会空指针
            if (!statsMap.containsKey(str)) {
                statsMap.put(str, 1);
            } else {
                statsMap.put(str, statsMap.get(str) + 1);
            }
        }
        return statsMap;
    }

    /**
     * 用最小堆解题
     */
    public static List<String> calcKMaxByMinHeap(HashMap<String, Integer> map, Integer k) {
        PriorityQueue<StrInfo> minHeap = new PriorityQueue<>(new Comparator<StrInfo>() {
            @Override
            public int compare(StrInfo o1, StrInfo o2) {
                if (!o1.count.equals(o2.count)) {
                    return o1.count - o2.count;
                } else {
                    return o2.str.compareTo(o1.str);
                }
            }
        });
        map.forEach((str, count) -> {
            // 将每一条统计数据入堆,入堆时会按照上面的比较规则做成最小堆
            minHeap.add(new StrInfo(str, count));
            // 入堆后如果元素数量超过了k,扔掉堆顶元素
            if (minHeap.size() > k) {
                minHeap.poll();
            }
        });

        // 将堆中的k个单词放入结果集
        List<String> result = new ArrayList<>();
        while (!minHeap.isEmpty()) {
            result.add(minHeap.poll().str);
        }
        // 结果倒转,按题目要求的顺序return
        Collections.reverse(result);
        return result;
    }

    /**
     * 用最大堆解题
     */
    public static List<String> calcKMaxByMaxHeap(HashMap<String, Integer> map, Integer k) {
        PriorityQueue<StrInfo> maxHeap = new PriorityQueue<>(new Comparator<StrInfo>() {
            @Override
            public int compare(StrInfo o1, StrInfo o2) {
                if (!o1.count.equals(o2.count)) {
                    return o2.count - o1.count;
                } else {
                    return o1.str.compareTo(o2.str);
                }
            }
        });
        // 将每一条统计数据入堆,入堆时会按照上面的比较规则做成最大堆
        map.forEach((str, count) -> {
            maxHeap.add(new StrInfo(str, count));
        });
        // 取前k个堆顶元素即为前K个高频单词
        List<String> result = new ArrayList<>();
        while (k > 0) {
            result.add(maxHeap.poll().str);
            k--;
        }
        return result;

    }
}


class StrInfo {
    String str;
    Integer count;

    public StrInfo(String str, Integer count) {
        this.str = str;
        this.count = count;
    }
}

测试:

public class P692 {
    public static void main(String[] args) {
        String[] array = {"i", "love", "leetcode", "i", "love", "coding"};
        System.out.println(calcKMaxByMinHeap(stats(array), 2));
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/751063.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis~配置解析, 属性(properties)、设置(settings)

注意, 对应的名称一定要相同, 比如username就要对应username, 而且如果同时使用外部配置文件和property, 优先级是外部配置文件优先级更高 设置&#xff08;settings&#xff09; 这是 MyBatis 中极为重要的调整设置&#xff0c;它们会改变 MyBatis 的运行时行为。 下表描述了…

利用Python控制终端打印字体的颜色和格式

利用Python控制终端打印字体的颜色和格式—操作详解&#xff08;ANSI转义序列&#xff09; 一、问题描述二、ANSI转义序列三、具体代码和显示效果&#xff08;看懂这段代码&#xff0c;以后可随心控制字体的打印格式&#xff09; 欢迎学习交流&#xff01; 邮箱&#xff1a; z……

Linux系统相关函数总结

在应用程序当中&#xff0c;有时往往需要去获取到一些系统相关的信息&#xff0c;譬如时间、日期、以及其它一些系统相关信息&#xff0c;本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取这些系统信息。除此之外&#xff0c;还会向大家介绍 Linux 系统下的/proc 虚拟文…

Android 13 为应用创建快捷方式

参考 developer.android.google.cn 创建快捷方式 来自官网的说明&#xff1a; 静态快捷方式 &#xff1a;最适合在用户与应用互动的整个生命周期内使用一致结构链接到内容的应用。由于大多数启动器一次仅显示四个快捷方式&#xff0c;因此静态快捷方式有助于以一致的方式执行…

TikTok API接口——获取视频评论信息

一、引言 TikTok&#xff0c;作为全球最受欢迎的短视频社交平台之一&#xff0c;不仅为用户提供了展示才华和分享生活的舞台&#xff0c;也为品牌和企业提供了与年轻用户互动的新渠道。在这个信息爆炸的时代&#xff0c;了解用户的声音、掌握舆论动向显得尤为重要。通过TikTok…

uview中的utabs组件item字数不一致导致滑块偏移

给item单独设置宽度&#xff0c;使滑块计算准确 ::v-deep .u-scroll-box .u-tab-item {width: 80px !important;&:nth-child(3),&:nth-child(4),&:nth-child(5) {width: 60px !important;}flex: 1 1 0% !important; }效果如下&#xff1a;

【TOOL】ceres学习笔记(一) —— 教程练习

文章目录 一、Ceres Solver 介绍二、Ceres 使用基本步骤1. 构建最小二乘问题2. 求解最小二乘问题 三、使用案例1. Ceres Helloworld2. Powell’s Function3. Curve Fitting4. Robust Curve Fitting 一、Ceres Solver 介绍 Ceres-solver 是由Google开发的开源C库&#xff0c;用…

吐血推荐!3款视频生成工具,全部国产,都免费

AI视频大模型的爆发&#xff0c;让创作爆款视频不再是专业人士的能力。 今天二师兄给大家推荐3款免费的视频生成工具。 01 可灵 推荐指数 &#xff1a; 五颗星 先看效果 可灵大模型测试 可灵大模型是快手AI团队自主研发的视频生成大模型&#xff0c;具备强大的视频创作能力&a…

大数据开发需要哪些职场知识

职场是个人情世故的江湖&#xff0c;除了专业技能&#xff0c;成功的大数据开发人员还需要掌握多种职场知识。以下是一些重要的职场知识和技能&#xff0c;结合实际例子详细说明。 目录 理论知识与工程实践理论知识工程实践例子 项目经验总结项目管理总结和反思例子 做事方式方…

【python】OpenCV—Color Map

文章目录 cv2.applyColorMapcv2.putText小试牛刀自定义颜色 参考学习来自 OpenCV基础&#xff08;21&#xff09;使用 OpenCV 中的applyColorMap实现伪着色 cv2.applyColorMap cv2.applyColorMap() 是 OpenCV 中的一个函数&#xff0c;用于将灰度图像或单通道图像应用一个颜色…

《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID Controllers》

期刊&#xff1a;CVPR 年份&#xff1a;2023 代码&#xff1a;https://github.com/XuJiacong/PIDNet 摘要 双分支网络架构已经证明了它在实时语义分割任务中的有效性和有效性。然而&#xff0c;高分辨率细节和低频上下文的直接融合的缺点是细节特征很容易被周围的上下文信息…

Qt开发 | Qmake与CMake | Qt窗口基类 | VS Qt项目与QtCreator项目相互转化 | Qt架构 | Qt学习方法

文章目录 一、Qmake与CMake介绍1.Qmake2.CMake3.使用qmake还是cmake&#xff1f; 二、Qt3个窗口基类的区别三、vs qt与QtCreator项目相互转化方法1.QtCreator项目转VS Qt2.VS Qt项目转QtCreator项目 四、Qt架构介绍与学习方法详解 一、Qmake与CMake介绍 Qmake和CMake都是构建系…

vue启动时的错误

解决办法一&#xff1a;在vue.config.js中直接添加一行代码 lintOnSave:false 关闭该项目重新运行就可启动 解决办法二&#xff1a; 修改组件名称

机械装备制造行业MES,实时监控生产流程

装备制造行业MES&#xff0c;是专门为装备制造行业设计的生产信息化管理系统。旨在实时监控装备制造生产流程&#xff0c;实现全流程的精细化管理和监控&#xff0c;提高生产效率、降低生产成本、提升产品质量。 本文将详细介绍装备制造行业MES的概念、技术及应用&#xff0c;…

放大招了|十亿参数大模型LLMs运行功耗仅需13W,内存使用量减少90%!

矩阵乘法&#xff08;MatMul&#xff09;历来是大型语言模型&#xff08;LLMs&#xff09;总体计算成本的主导因素&#xff0c;尤其在模型向更大维度嵌入和上下文长度发展时&#xff0c;这一成本呈指数级增长。 近期有一篇刚刚发表的论文中提出的方法完全去除了矩阵乘法操作&am…

系统架构师考点--系统配置与性能评价

大家好。今天我们来总结一下系统配置与性能评价的考点内容&#xff0c;这一部分一般是出在上午场的选择题中&#xff0c;占1-2分左右。 一、性能指标 计算机 对计算机评价的主要性能指标有&#xff1a;时钟频率(主频)&#xff1b;运算速度&#xff1b;运算精度内存的存储容量…

现在纠结于到底是学stm32好还是Arduino好?

如果你就是要搞单片机&#xff0c;学STM32。 如果你要搞机器人、物联网、机器视觉、自动驾驶&#xff0c;就要学Arduino。 搞单片机&#xff0c;除了STM32之外&#xff0c;重点在于画好原理图和PCB。刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「stm32的…

HarmonyOS Next开发学习手册——内存管理(GC)

GC&#xff08;全称 Garbage Collection&#xff09;&#xff0c;即垃圾回收。在计算机领域&#xff0c;GC就是找到内存中的垃圾&#xff0c;释放和回收内存空间。当前主流编程语言实现的GC算法主要分为两大类&#xff1a;引用计数和对象追踪&#xff08;即Tracing GC&#xff…

【系统架构设计师】计算机组成与体系结构 ③ ( 层次化存储结构 | 寄存器 | 高速缓存 | 内存 | 外存 )

文章目录 一、层次化存储结构1、层次化存储结构2、层次化存储结构 - 示例说明3、程序员可操作的部分 计算机 采用 分级存储结构 , 主要目的是 为了 解决 容量 / 价格 / 速度 之间的矛盾 ; 一、层次化存储结构 1、层次化存储结构 计算机 存储器 按照存储速度 由快到慢 进行排序 …