【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 认证登录以满足上面的要…

Dxf库中的DL_CreationAdapter与DL_CreationInterface

在软件工程中&#xff0c;适配器模式&#xff08;Adapter Pattern&#xff09;用于将一个类的接口转换成客户希望的另一个接口。在 DXF 文件解析中&#xff0c;DL_CreationAdapter 和 DL_CreationInterface 可能用于适配不同的数据结构或接口&#xff0c;使得解析器能够处理不同…

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

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

pyqt的QWidgetList如何多选?如何按下Ctrl多选?

通过设置setSelectionMode(QAbstractItemView.MultiSelection)&#xff0c;可以实现QWidgetList的多选。 但是上述结果不太符合我们需求。设置多选模式后&#xff0c;只需鼠标点击就可以选择多个条目。 我希望按下Ctrl键时才进行多选&#xff0c;仅鼠标单击的话&#xff0c;只进…

bat命令 批处理 脚本 windows DOS

常见命令解释 命令示例&#xff1a; 文件1.bat echo offstart notepad.exe timeout /t 5 /nobreak start notepad.exe pause echo 当前时间【%time%】 timeout /t 5 /nobreak echo 延时时间【%time%】 pause echo off 执行bat文件的时候&#xff0c;cmd黑框里不显示批处理…

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…

CTE(公共表表达式)和视图在查询时的性能影响

在SQL查询优化和数据库设计中&#xff0c;CTE&#xff08;公共表表达式&#xff09;和视图都是常用的工具。尽管它们在功能和使用场景上有很多相似之处&#xff0c;但在查询性能方面可能存在显著差异。本文将探讨CTE和视图在查询时的性能影响&#xff0c;帮助您在实际项目中做出…

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

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

Flutter有哪些优势,为什么稳定的大公司都向Flutter迁移?

Flutter作为Google开发的跨平台移动应用开发框架&#xff0c;具有一系列显著的优势&#xff0c;以下是对其优势的详细归纳&#xff1a; 跨平台开发能力&#xff1a; Flutter允许开发人员使用单一代码库创建适用于Android和iOS的应用程序&#xff0c;大大减少了开发和维护的工作…

发送HTTP请求并与一个假设的MES系统进行对接案例。

假设我们有一个MES系统&#xff0c;它提供了一个RESTful API用于获取订单信息。API的URL是https://api.mes-system.com/orders/{orderId}&#xff0c;其中{orderId}是一个占位符&#xff0c;需要替换为实际的订单ID。 以下是demo&#xff1a; using System; using System.Ne…

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

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

sql-analysis

文章目录 痛点&#xff1a; 1、无法提前发现慢sql&#xff0c;可能恶化为慢sql的语句 2、线上出现慢sql后&#xff0c;无法快速止损 后果&#xff1a;一般是以响应时间来发现慢sql&#xff0c;这时候已经对业务产生了一定影响&#xff0c;这时候就要改代码重新发布上线或者改数…

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

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

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

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

HarmonyOS鸿蒙应用开发基础知识

参考 HarmonyOS鸿蒙应用开发 (二、应用程序包结构理解及Ability的跳转&#xff0c;与Android的对比)_hap(harmonyos ability package)包的开发-CSDN博客 HarmonyOS NEXT下一代编程语言仓颉介绍及入门-CSDN博客 媒体模块&#xff1a; AVCodec Kit&#xff08;音视频编解码服务…

TextRank 算法

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

Grafana 对接 Zabbix 数据源API错误

介绍 主要报错为 Invalid params. Invalid parameter "/": unexpected parameter "user". 主要原因为Zabbix 6.4.0以上的版本更新了API&#xff0c;导致Grafana的数据源插件不兼容。 解决方案 更新到最新的Grafana 和 grafana-zabbix 插件即可。&#x…

react输入框输入的空格 样式 和输入后页面显示一致

为了确保在 React 输入框中输入的空格样式和输入后页面显示一致&#xff0c;你可以使用 CSS 的 white-space 属性来控制空格的显示。具体来说&#xff0c;可以使用 pre-wrap 值来保留空格和换行符。 import React, { useState, useEffect, useRef } from react; import ./App.…

uniapp生成微信小程序二维码

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