【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>() {@Overridepublic 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);}// 结果倒转,按题目要求的顺序returnCollections.reverse(result);return result;}/*** 用最大堆解题*/public static List<String> calcKMaxByMaxHeap(HashMap<String, Integer> map, Integer k) {PriorityQueue<StrInfo> maxHeap = new PriorityQueue<>(new Comparator<StrInfo>() {@Overridepublic 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));}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 privacyIDEA 实现 Windows RDP 多因素认证 (MFA)

前言 在等保 2.0 标准中有要求: d&#xff09;应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别&#xff0c;且其中一种鉴别技术至少应使用密码技术来实现。 可以借助开源的 privacyIDEA 配合 AD 域环境实现 RDP MFA 认证登录以满足上面的要…

音视频入门基础:H.264专题(7)——FFmpeg源码中 指数哥伦布编码的解码实现

一、引言 由于视频的传输和存贮是十分在乎体积的&#xff0c;对于每一个比特&#xff08;bit&#xff09;都要格外珍惜&#xff0c;所以H.264中用到了多种熵编码来对原本的数据进行压缩。 比如Sequence Paramater Set&#xff08;sps / 序列参数集&#xff09;中&#xff0c;s…

python获取快手账号列表数据

快手数据获取相对简单访问地址固定且不需要登录token 列表地址获取的固定接口 https://www.kuaishou.com/graphql 发送post请求注意每个快手账号对应的id import time from datetime import datetime import logging import json import pymysql import requests# 创建一个lo…

python爬虫之12306模拟登陆

python爬虫之12306模拟登陆 登录流程&#xff1a; 1、登录界面输入账号密码&#xff0c;点击立即登录 2、弹出手机验证界面&#xff0c;输入身份证后4位&#xff0c;点击获取验证码等待验证码后手动输入&#xff0c;点击确定登录 实现代码如下&#xff1a; #需求&#xff1…

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上&#xff0c;或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景&#xff1a; 表单…

联想至像M3070DNA打印机加粉及清零方法

基本参数&#xff1a; 产品类型&#xff1a;黑白激光多功能商用一体机&#xff08;打印/复印/扫描&#xff09; 网络功能&#xff1a;支持有线网络打印 最大处理幅面&#xff1a;A4 双面功能&#xff1a;自动 打印速度&#xff1a;30页/分钟&#xff08;高速激光打印&…

HarmonyOS NEXT:华为开启全新操作系统时代

在全球科技浪潮的汹涌澎湃中&#xff0c;华为再次以创新者的姿态&#xff0c;引领了一场关于操作系统的革命。HarmonyOS NEXT&#xff0c;这一由华为倾力打造的分布式操作系统&#xff0c;不仅是对现有技术的一次大胆突破&#xff0c;更是对未来智能生活的一次深邃展望。 Harmo…

【耐水好】强耐水UV胶水是怎样的?

【耐水好】强耐水UV胶水是怎样的&#xff1f; 强耐水UV胶水是一种特殊的胶水&#xff0c;其设计重点在于其出色的耐水性能。以下是关于强耐水UV胶水的特点&#xff1a; 优异的耐水性能&#xff1a;这种胶水能在水环境下保持稳定的粘接强度&#xff0c;不易被水分解或削弱。因…

TextRank 算法

第1关&#xff1a;Jieba 在关键词提取中的应用 任务描述 本关任务&#xff1a;根据本关所学有关使用 Jieba 库进行关键词提取的知识&#xff0c;编写使用 Jieba 模块进行关键词提取的程序&#xff0c;并通过所有测试用例。 相关知识 为了完成本关任务&#xff0c;你需要掌握…

uniapp生成微信小程序二维码

文章目录 一、获取不限制的小程序码1、第一步&#xff1a;需要先获取ACCESS_TOKEN2、第二步&#xff1a;获取微信小程序二维码 二、获取小程序码1、第一步&#xff1a;需要先获取ACCESS_TOKEN2、第二步&#xff1a;获取微信小程序二维码 三、扫普通链接二维码打开小程序1、协议…

反向代购是怎么火起来的?今后的发展趋势如何?

反向代购和反向海淘的兴起可以归因于多个因素&#xff0c;这些因素共同推动了海外消费者对中国商品的需求和购买热潮。以下是对其火起来的原因的详细分析&#xff1a; 海外华人华侨的需求增加&#xff1a; 随着中国国际移民群体的扩大&#xff0c;海外华人华侨数量不断增多。这…

第三届仿真模拟、电子信息科学与技术国际学术会议(SMEI 2024,8月02-04)

随着仿真模拟技术的成熟和进步&#xff0c;仿真模拟技术越来越广泛地应用于工业工程、管理科学、社会经济、交通运输、生态环境、军事装备等各个科学领域&#xff0c;并深刻影响着信息技术和信息产业的发展。围绕仿真模拟、电子信息科学与技术等方面内容&#xff0c;为更好地促…

Gartner发布2024年企业高管增长议程:使网络安全投资与业务增长保持一致

网络安全投资和准备被视为推动企业发展的关键因素。除了避免损失之外&#xff0c;高管还应利用有效的以业务为中心的安全方法&#xff0c;通过大规模实现敏捷性和创新来推动收入增长。 主要发现 高增长公司通过扩大商业足迹来推动业绩&#xff0c;这需要大规模的创新、敏捷性和…

002 使用kibana操作ElasticSearch7.x

文章目录 4.使用kibana操作es4.1.文档操作1.put方式发送数据2.post方式发送数据3.查看索引文档 GET4.更新文档 POST5.删除文档&索引 DELETE6.批量添加数据_bulk 4.2.Query DLS(查询领域对象语言)1.url 检索数据语法2.查询所有数据3.查询全部数据并排序4.查询全部数据排序并…

时序分析基本概念介绍——min period 最小时钟周期

文章目录 前言一、什么是 min period&#xff1f;二、为什么检查 min period&#xff1f;三、如何设置 min period&#xff1f;四、如何检查 min period&#xff1f;五、如何修复 min period&#xff1f;总结 前言 我们在实际设计中可能会碰到这种情况&#xff0c;如果我们的m…

介绍ES6中的class类:(一) 类的基本语法

一、类的由来与简介 1. 简介 很早很早之前&#xff0c;在JavaScript的世界里&#xff0c;生成实例对象的传统方法是通过构造函数。 嗯哼&#xff1f; function Point(x, y) {this.x x;this.y y; }Point.prototype.toString function () {return ( this.x , this.y )…

计算机图形学入门18:阴影映射

1.前言 前面几篇关于光栅化的文章中介绍了如何计算物体表面的光照&#xff0c;但是着色并不会进行阴影的计算&#xff0c;阴影需要单独进行处理&#xff0c;目前最常用的阴影计算技术之一就是Shadow Mapping技术&#xff0c;也就是俗称的阴影映射技术。 2.阴影映射 Shadow Map…

提升用户转化率秘诀!Xinstall的H5拉起应用技术让您领先一步!

在移动互联网时代&#xff0c;App的推广和运营面临着诸多挑战。其中&#xff0c;H5页面如何高效、便捷地拉起应用&#xff0c;成为了一个亟待解决的问题。今天&#xff0c;我们就来谈谈如何利用Xinstall品牌&#xff0c;轻松解决这一痛点&#xff0c;提升用户体验&#xff0c;助…

boss直聘招聘数据爬取及可视化分析2.0

boss直聘招聘数据爬取及可视化分析2.0 一、需求介绍二、完整代码2.1 爬虫代码2.2 数据可视化模块一、需求介绍 笔者在前两篇介绍boss直聘招聘数据爬取和可视化分析的博客的基础上,对代码和功能进行了完善。在数据爬取的模块,代码更加简洁易懂,且性能更加稳定;在数据可视化…

SpringBoot | 使用jwt令牌实现登录认证,使用Md5加密实现注册

对于登录认证中的令牌&#xff0c;其实就是一段字符串&#xff0c;那为什么要那么麻烦去用jwt令牌&#xff1f;其实对于登录这个业务&#xff0c;在平常我们实现这个功能时&#xff0c;可能大部分都是通过比对用户名和密码&#xff0c;只要正确&#xff0c;就登录成功&#xff…