最大堆,最小堆,优先队列,堆排序 LC例题-找第K大元素

LC215 数组中的第K个最大元素

class Solution {static Comparator<Integer> cmp = new Comparator<Integer>(){@Overridepublic int compare(Integer i1, Integer i2){return i1 - i2;//升序排列//  return i2 - i1;//降序}};
public static int findKthLargest(int[] nums, int k) {int len = nums.length;PriorityQueue<Integer> minTop = new PriorityQueue<>(k,cmp);for (int i = 0; i < k; i++){minTop.add(nums[i]);//add 添加元素}for (int i = k; i < len; i++){Integer topEle = minTop.peek();  // 返回队头元素(不删除),失败时前者//peek取出队头元素,不删除// 只要当前遍历的元素比堆顶元素大,堆顶弹出,遍历的元素进去(把最小的元素排出去)if (nums[i] > topEle){minTop.poll();  // 获取队头元素并删除,并返回,失败时前者抛出null,minTop.offer(nums[i]);  // 在队尾插入元素,插入失败时抛出false,并}}return minTop.peek();//(k个里面最小的,就是第k大的)}   
}

定义:

最大堆是一种完全二叉树,其中每个节点的值都大于等于其子节点的值(也就是根节点是最大的),除根节点外每个节点都满足父节点的值大于等于其子节点的堆属性。(大根堆)

最小堆也是一种完全二叉树,其中每个节点的值都小于等于其子节点的值(也就是根节点是最小),除根节点外每个节点都满足父节点的值小于等于其子节点的堆属性。

应用:

堆排序是一种利用堆的数据结构进行排序的算法,nlogn

优先队列:常用于资源调度,任务调度

中位数维护:使用两个堆来维护数据流中的中位数,一个堆最大堆存数据流的前半部分,一个最小堆存数据流后半部分。

最大堆(优先队列)的删除

最大堆的操作先从简单的来,最大堆的设计就是为了方便将最大元素或最小元素以最小的代价给出。

从上面的树中,删除一个最大元素将使得根结点被弹出。需要对根结点经行补全,此时要寻找最大堆中剩余节点中的最大元素补到根结点的位置,也就是数组中下标为1的位置。

很显然,下面的元素中,最大元素必然是根节点的左右子树中较大的那一个。

我们将根节点补充为其较大的那一个儿子。而这个被拿去补充根节点的元素所占的位置仍然需要其较大的子结点去补充,这样不断向下,直到被拿去补充的元素不再拥有左右子树,退出循环。

最大堆(优先队列)的插入

最大的的插入与删除类似于反向操作。

我们首先将要插入的数据放在最大堆的尾部,然后比较其父亲子树与该结点的参数大小,若插入的参数大于其父亲结点的参数,则二者做交换。在不断向上交换的过程中,循环什么时候结束呢?

没错,当比较的元素N/2为0,我们先前定的Flag时,则退出循环,若是最大堆可以将Flag定位无穷大,反之可以定为0或无穷小。

优先队列(Java的PriorityQueue)

PriorityQueue实现了Queue接口,可以存放基本数据类型的包装类或自定义的类(前提是都可排序,必须实现Comparable接口,并根据需要重写CompareTo方法)。

对于基本数据类型的包装类,优先队列中元素默认排列顺序是升序排列。

对于自定义的类,需要定义比较器。

请注意,此实现不同步。 如果任何线程修改队列,多线程不应同时访问PriorityQueue实例。 而是使用线程安全的PriorityBlockingQueue

Comparator<Object> cmp = new Comparator<Object>() {

public int compare(Object o1, Object o2) {

//升序

return o1-o2;

//降序

return o2-o1;

}

};

可以使用以下方法来操作优先队列

insert(key):向优先队列中插入一个元素,时间复杂度为O(logN)。

deleteMin():删除并返回优先队列中优先级最高的元素,时间复杂度为O(logN)。

getMin():返回优先队列中优先级最高的元素,但不进行删除,时间复杂度为O(1)。

add(元素)或offer(元素):向队列中添加元素。

remove()或poll():移除并返回队列中的第一个(最高优先级)元素。

peek():返回队列中的第一个(最高优先级)元素,但不进行移除。

isEmpty():检查队列是否为空。

size():返回队列中的元素个数。

默认情况下,优先队列中的元素按照自然顺序进行排序。但也可以通过传递一个自定义的Comparator对象来指定元素的比较规则。

关于PriorityQueue的使用要注意:

1. 使用时必须导入 PriorityQueue 所在的包,即:

import java.util.PriorityQueue;

2. PriorityQueue 中放置的 元素必须要能够比较大小,不能插入无法比较大小的对象 ,否则会抛出 ClassCastException异常

3. 不能插入null对象 ,否则会抛出 NullPointerException

4. 没有容量限制,可以插入任意多个元素,其内部可以自动扩容

5. 插入和删除元素的时间复杂度为O(logN)

6. PriorityQueue 底层使用了 堆数据结构

7. PriorityQueue 默认情况下是小堆 --- 即每次获取到的元素都是最小的元素

默认情况下,PriorityQueue队列是小堆(即队首是最小元素,升序),如果需要大堆需要用户提供比较器

// 用户自己定义的比较器:直接实现Comparator接口,然后重写该接口中的compare方法即可

class IntCmp implements Comparator<Integer>{

@Override

public int compare(Integer o1, Integer o2) {

return o2-o1;

}

}

public class TestPriorityQueue {

public static void main(String[] args) {

PriorityQueue<Integer> p = new PriorityQueue<>(new IntCmp());

p.offer(4);

p.offer(3);

p.offer(2);

p.offer(1);

p.offer(5);

System.out.println(p.peek());

}

}

常用方法:

如果容量小于 64 时,是按照 oldCapacity 的 2 倍方式扩容的

如果容量大于等于 64 ,是按照 oldCapacity 的 1.5 倍方式扩容的

如果容量超过 MAX_ARRAY_SIZE ,按照 MAX_ARRAY_SIZE 来进行扩容

优先队列应用

任务调度:在多线程或分布式系统中,任务调度是一个重要的问题。优先队列可以根据任务的优先级来决定执行顺序,高优先级的任务会被首先执行。

搜索算法:在图搜索、最短路径、A*算法等问题中,优先队列可以用来存储待探索的节点,并按照启发式函数的值(估计到目标的距离)进行排序,以便选择下一个最有希望的节点进行探索。

带有时间限制的调度问题:在某些场景下,任务可能有截止时间。优先队列可以根据任务的截止时间来确定执行顺序,确保在截止时间前完成最高优先级的任务。

数据压缩:在哈夫曼编码等数据压缩算法中,优先队列可以用来存储字符及其出现频率,然后构建压缩树。

操作系统调度:操作系统中的进程调度也可以使用优先队列来实现,根据进程的优先级来决定调度顺序。

参考:chatGPT

【Java】PriorityQueue--优先级队列_java priorityqueue-CSDN博客

学习一波Java语言中的优先队列 PriorityQueue_java 优先队列-CSDN博客

Java优先队列PriorityQueue使用详解_java priorityqueue用法-CSDN博客

数据结构学习之——最大堆、最小堆(优先队列、哈夫曼树)_最大堆和最小堆原理-CSDN博客

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

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

相关文章

湖南(品牌定位)源点咨询 企业如何选择品牌定位差异化调研

湖南源点认为&#xff1a;精准且占据消费者认知&#xff0c;探寻与消费者共鸣的常态化品牌定位调研是企业品牌长远健康发展的基石。 品牌定位里要强调品牌的差异。英文是point of difference. 这个差异点就是强调品牌能带来的利益&#xff08;benefit&#xff09;。 这个“利…

【NoSQL数据库】Redis命令、持久化、主从复制

Redis命令、持久化、主从复制 redis配置 Redis命令、持久化、主从复制Redis数据类型redis数据库常用命令redis多数据库常用命令1、多数据库间切换2、多数据库间移动数据3、清除数据库内数据 key命令1、keys 命令2、判断键值是否存在exists3、删除当前数据库的指定key del4、获取…

记录layui-table中操作列的宽度随着权限变化而变化

最近做一个项目&#xff0c;某个页面因为角色不同&#xff0c;所以显示的的按钮有所不同。 管理员权限 普通人员权限 layui引入的table宽度是写死的&#xff0c;不能随着自动变化&#xff0c;查了一些资料&#xff0c;让写入css的方法 .layui-table th, .layui-table td { whi…

LabVIEW的大气环境实时监测

LabVIEW的大气环境实时监测 设计并实现了一个基于LabVIEW的大气环境实时监测系统。通过使用高精度环境传感器采集温度、湿度、PM2.5、CO2等环境数据&#xff0c;利用LabVIEW进行数据处理、显示和存储。该系统能够实时监控环境参数&#xff0c;并通过阈值报警功能提示异常&…

Linux中,ll 命令 列出目录的内容

文章目录 1、2、3、4、5、 1、 在Linux中&#xff0c;ll 通常是一个别名&#xff08;alias&#xff09;用于 ls -l 命令。ls 命令用于列出目录的内容&#xff0c;而 -l 选项会以长格式&#xff08;long format&#xff09;显示信息&#xff0c;包括文件或目录的权限、所有者、…

E.小绿的房子[牛客周赛45][二维vector存图巧解]

题目描述 B市的地图是一棵有nn个节点的树&#xff0c;每个节点上都有房子出售。小棕和小绿是一对好朋友&#xff0c;他们近期都准备在B市买房。为了方便周末一起玩&#xff0c;小绿希望他的房子一定不要离小棕的太远。不过为了给小棕一个惊喜&#xff0c;小绿没有去找小棕问他买…

【SITS_CC】卫星图像时间序列的变化字幕(IEEE GRSL)

摘要 Satellite images time series (SITS) 提供了一种有效的方法来同时获取地球上观测区域的时间和空间信息。然而&#xff0c;传统的遥感CD方法的输出是二进制图或语义变化图&#xff0c;往往难以被最终用户解释&#xff0c;传统的遥感图像变化字幕方法只能描述双时图像。提…

【python】成功解决“ModuleNotFoundError: No module named ‘timm’”错误的全面指南

成功解决“ModuleNotFoundError: No module named ‘timm’”错误的全面指南 一、引言 在Python编程中&#xff0c;经常会遇到各种导入模块的错误&#xff0c;其中“ModuleNotFoundError: No module named ‘timm’”就是一个典型的例子。这个错误意味着你的Python环境中没有安…

充电宝哪款质量好性价比高?精选四大宝藏款充电宝分享

在这个快节奏的数字时代&#xff0c;智能手机、平板电脑等电子设备已成为我们日常生活与工作中不可或缺的伙伴。然而&#xff0c;电量焦虑似乎也如影随形&#xff0c;时刻考验着我们的耐心与行程安排。于是&#xff0c;一款质量上乘、性价比高的充电宝便成了许多人的随身必备“…

“JS逆向 | Python爬虫 | 动态cookie如何破~”

案例目标 目标网址:aHR0cHMlM0EvL21hdGNoLnl1YW5yZW54dWUuY29tL21hdGNoLzI= 本题目标:提取全部 5 页发布日热度的值,计算所有值的加和,并提交答案 常规 JavaScript 逆向思路 JavaScript 逆向工程通常分为以下三步: 寻找入口:逆向工程的核心在于找出加密参数的生成方式。…

KT1025A的双模蓝牙芯片,参考标准蓝牙天线,蓝牙距离短,会卡

一、问题简介 使用KT1025A的双模蓝牙芯片&#xff0c;为什么我参考BT201或者BT301&#xff0c;或者BT321F设计的蓝牙天线&#xff0c;蓝牙距离短&#xff0c;会卡等等&#xff0c;这个可能是什么原因&#xff0c;如何改善呢&#xff1f; 问题详细分析 首先看看客户的板子PCB…

MT2085 小码哥的福利

思路&#xff1a; 1. 耐受度从小到大排序&#xff0c;每一个甜品都找到第一个能忍受其甜度的手下。 例如样例&#xff1a;甜度为1的2份甜品给第1个人吃&#xff08;此人耐受为2&#xff09;&#xff1b;甜度为3的9份甜品给第2个人吃&#xff08;此人耐受为3&#xff09;&…

计算机网络学习记录 运输层 Day5

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…

python-flask项目的服务器线上部署

在部署这部分我首先尝试了宝塔面板&#xff0c;始终连接失败 换了一种思路选择了Xshell成功连接 首先我们需要下载个免费版本的Xshell 免费的&#xff1a;家庭/学校免费 - NetSarang Website 下载完毕打开 1新建-> 输入服务器的账号密码&#xff1a; 在所有会话中点击自…

如何避免U盘数据泄露?U盘重要文件怎么加密?

U盘是最常用的移动存储设备&#xff0c;小巧的体积可以帮助我们存储大量数据。而为了保护U盘数据&#xff0c;避免文件泄露&#xff0c;我们需要加密保护U盘。那么&#xff0c;U盘重要文件该怎么加密呢&#xff1f;下面我们就来了解一下吧。 BitLocker 当你的U盘文件不多&…

自动驾驶仿真:python和carsim联合仿真案例

文章目录 前言一、Carsim官方案例二、Carsim配置1、车辆模型2、procedure配置3、Run Control配置 三、python编写四、运行carsim五、运行python总结 前言 carsim内部有许多相关联合仿真的demo&#xff0c;simulink、labview等等都有涉及&#xff0c;这里简单介绍下python和car…

vuInhub靶场实战系列-DC-9实战

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置二、信息收集2.1 主机发现2.2 端口扫描2.3 指纹识别2.4 目录扫描2.4.1 Nikto目录扫描2.4.2 dirsearch目录扫描 2.5 漏洞发现2.5.…

OTTO、亚马逊、Temu卖家如何运用测评补单来提高购买率?

在跨境电商的广阔舞台上&#xff0c;测评补单无疑是一股不可或缺的强劲动力。商家们深知&#xff0c;通过补单这一手段&#xff0c;能够快速为产品注入活力&#xff0c;使销量迅猛攀升&#xff0c;评论如潮涌至&#xff0c;进而在激烈的竞争中脱颖而出&#xff0c;勇攀销量之巅…

绘画新手必备!六款免费易用的绘图软件推荐

在当今的数字世界里有各种各样的设计创作工具&#xff0c;那么问题来了我们应该如何在众多免费绘图软件中选择呢&#xff1f;为了回答这个问题&#xff0c;我们将在本文中介绍和测评六个领先的绘图软件。每一个都有自己独特的特点和优势&#xff0c;适合不同的需求和用户。以下…

香港优才计划是什么?一文说明白2024香港优才政策、申请条件、流程及利弊

香港优才计划是拿香港身份比较热门的方式之一&#xff0c;对很多想要保留生活重心在内地&#xff0c;但是又需要香港身份为子女规划教育升学的人来说&#xff0c;申请香港优才计划是获取香港身份再好不过的方式。 我们刚开始了解香港优才计划可能会有各种各样的担心&#xff0…