算法通关村第十四关白银挑战——堆的经典算法题

news2024/11/30 2:38:24

关注微信公众号:怒码少年。
回复关键词:【电子书】,领取多本计算机相关电子书

大家好,我是怒码少年小码。

今天开始进入新的篇章——堆!这里我默认了大家都知道堆的基本知识了,我们来看看关于堆的两道高频算法题吧。

数组中的第K个最大元素

LeetCode 215:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

示例:

  • 输入: [3,2,1,5,6,4], k = 2
  • 输出: 5

分析:本题的方法有三种:选择法、快速排序和堆查找

  1. 选择法

类似于冒泡排序,第一个排序找出第1大的元素,第二次排序找出第2大的元素,第k次排序找出第k大的元素。

  1. 快速排序:之前已经讲过
  2. 堆查找

利用堆解决这个问题:首先思考用最大堆还是最小堆?答:最小堆。

原因:构造一个k大小的最小堆,则这个堆里存放的就是前k大的元素,只有比堆顶这个堆中最小的元素大,才能进入堆中。最后这个堆顶就是第k大的元素。

记忆口诀:

  • 查找:找大用小,大的进;找小用大,小的进
  • 排序:升序用小,降序用大。

[3,2,3,1,2,4,5,1,5,6,2,3]k=4。为例。注意:只有当前遍历的元素,大于堆顶元素才会入堆,否则丢弃。

堆的代码纯手写会很复杂,在Java中可以使用优先队列实现。

在 Java 中,PriorityQueue 是一个实现了优先队列(Priority Queue)的类。是基于优先级的队列,元素按照一定的优先级顺序进行排序并存储。

 public int findKthLargest(int[] nums, int k) {
    //利用优先队列和最小堆完成
    if(k > nums.length){
        return -1;
    }
    int len = nums.length;
    //创建一个还有k个元素大小的最小堆
    PriorityQueue<Integer> minHeap = new PriorityQueue<>(k,(a,b)->a-b);
    for(int i =0 ; i<k ; i++){
        minHeap.add(nums[i]);
    }
    for(int i = k ; i <len ; i++){
        //获取,但是不拿出,因为还不确定是不是要换
        Integer topEle = minHeap.peek();
        //只要当前遍历的元素比堆顶元素大,堆顶弹出,当前遍历的放进去
        if(nums[i] > topEle){
          minHeap.poll();
          minHeap.offer(nums[i]);
        }
    }
    return minHeap.peek();
}

offer()方法的作用是将元素插入到优先队列中,并根据定义的优先级顺序进行排序,以便在后续的操作中能够按照优先级顺序提取元素。

合并 K 个升序链表

LeetCode 23:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例:

  • 输入:lists = [[1,4,5],[1,3,4],[2,6]]
  • 输出:[1,1,2,3,4,4,5,6]
  • 解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。 1->1->2->3->4->4->5->6

分析:每个队列都是从小到大排序的,每次都要找最小的元素,我们要用小顶堆,不同的是每次比较谁更小

堆合并的策略:不管几个链表,最终都是按照顺序来的。每次都将剩余节点的最小值加到输出链表尾部,然后进行堆调整,最后堆空的时候,合并完成。

public ListNode mergeKLists(ListNode[] lists) {
    if(lists == null || lists.length == 0) return null;
//创建优先队列
    PriorityQueue<ListNode> q = new PriorityQueue<>(Comparator.comparing(node -> node.val));

    for(int i =0;i<lists.length;i++){
        if(lists[i] != null){
            q.add(lists[i]);
        }
    }

    ListNode dummy = new ListNode(0);
    ListNode tail = dummy;

    while(!q.isEmpty()){
        tail.next = q.poll();
        tail = tail.next;
        if(tail.next != null){
            q.add(tail.next);
        }
    }
    return dummy.next;
}

PriorityQueue<ListNode> q = new PriorityQueue<>(Comparator.comparing(node -> node.val)) 这段代码的意思是创建了一个优先队列 q,并指定了节点的比较方式。

首先,使node -> node.val 是一个 Lambda 表达式,用于定义优先队列 q 的比较器。它表示一个匿名函数,接受 ListNode 类型的参数 node,并返回 node.val。

具体来说,node -> node.val 表达式的作用是根据链表节点的值 val 进行比较。当两个链表节点进行比较时,比较器会调用这个表达式来获取节点的值,并根据节点值的大小来决定它们的顺序。

通过 Comparator.comparing() 方法,我们可以将这个 Lambda 表达式作为比较器传递给 PriorityQueue 构造函数,以创建一个根据节点值排序的优先队列。也就是说,优先队列 q 中的节点会根据节点值的大小进行排序,使得队列中的节点始终以升序排列

通过循环遍历 lists 数组,对每个链表进行判断。如果当前链表不为空(即非空链表),就将该链表的头节点(即最小值节点)加入到优先队列 q 中。

进入循环,持续执行以下步骤,直到优先队列 q 为空:

  • 从优先队列 q 中取出当前最小的节点,并将其设为 tail 的下一个节点。
    将 tail 指向新的节点。
  • 如果 tail.next 不为空,说明当前的已合并链表还有剩余节点。
  • 返回新链表 dummy 的下一个节点,即合并后的有序链表的头节点。

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

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

相关文章

基于Matlab的策动点阻抗快速综合库函数-微带线综合

基于Matlab的策动点阻抗快速综合库函数-微带线综合 参考书籍&#xff1a; MICROWAVE AMPLIFIER AND ACTIVE CIRCUIT DESIGN USING THE REAL FREQUENCY TECHNIQUE 1、环境安装 下载RFPLSynth包&#xff0c;链接&#xff1a;https://github.com/Grant-Giesbrecht/RFPLSynth。在…

Unisat的核心成员神秘失踪两个月后,CHAX横空出世

在这个快速变化的数字世界中&#xff0c;故事似乎总是在不断上演。最近&#xff0c;一则消息在加密货币社区中引起了轩然大波&#xff1a;Unisat的核心成员神秘失踪两个月后&#xff0c;CHAX横空出世&#xff0c;带来了一股新的风潮。 受够了BRC20-Swap多次难产&#xff0c;落地…

​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?

在当今汽车行业中&#xff0c;随着消费者偏好的多样化和年轻化&#xff0c;汽车制造商们正面临着前所未有的挑战与机遇。在2023年上海车展上&#xff0c;起亚汽车公司正式发布了全新紧凑级SUV——赛图斯。这款车型不仅标志着起亚对年轻消费市场的深入洞察&#xff0c;也展现了公…

块存储、文件存储、对象存储关系

参考&#xff1a;https://zhuanlan.zhihu.com/p/610322172

如何设值固定ip地址

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 如何设值固定ip地址 一、找到网络和Internet选项二、选择更改适配器选项2.双击&#xff0c;选择属性3.选择ipv4&#xff0c;点击属性4.选择使用下面的IP地 总结 一、找到网络…

密码套件:密码,算法和协商安全设置

本文深入地研究TLS 1.2密码套件的四个不同组件。首先看看我们在SSL / TLS中看到的两种不同类型的加密。 两种加密 SSL/TLS的最大困惑之一就是所使用的加密类型&#xff0c;与SSL证书关联的2048位密钥用于帮助协商HTTPS连接&#xff0c;但是它的作用实际上比大多数人认为的要小…

数据资产与自助BI的一体化实践

01 数据资产中的数据治理 随着数据资源被提高到数据资产的高度&#xff0c;数据治理成为确保有效管理和利用数据资产的一组流程和技术&#xff0c;而数据资产目录是包含企业数据资产的全息描述信息的存储库&#xff0c;并充当有效管理数据资产的&#xff08;逻辑上的&#xff…

EOCR-3E420,3EZ,3DE电机保护器与变频器配合使用的方法

上海韩施电气自动化设备有限公司提供 在工业现场中&#xff0c;电动机的起动与运行很多时候需要变频器参与其中&#xff0c;以达到降低电机维护成本、增加电机寿命的目的。采用变频器运转时&#xff0c;随着电机的加速相应提高频率和电压&#xff0c;起动电流被限制在 150%额定…

如何设置没有采购申请不允许创建采购订单(TCODE:OMET)<转载>

原文链接 &#xff1a; https://mp.weixin.qq.com/s/0kcj9JWltlZoYhmzlwvT5g 在SAP/ERP项目实施中可能经常会遇到这样的业务需求&#xff0c;在系统中创建采购订单PO必须要有采购申请PR&#xff0c;否则不允许创建采购订单&#xff0c;通常这样业务需求一般通过采购订单增强去实…

开源项目管理工具Helper的安装及汉化

什么是 Helper &#xff1f; Helper 是基于 Laravel 和 Filament 的开源项目管理工具。 官方提供了在线演示&#xff1a;https://project-helper.net 安装 在群晖上以 Docker 方式安装。 数据库理论上是可以使用群晖自带的 MariaDB 的&#xff0c;但老苏为了省事&#xff0c…

kimera论文阅读

功能构成&#xff1a; Kimera包括四个关键模块: Kimera-VIO的核心是基于gtsam的VIO方法[45]&#xff0c;使用IMUpreintegration和无结构视觉因子[27]&#xff0c;并在EuRoC数据集上实现了最佳性能[19]; Kimera-RPGO:一种鲁棒姿态图优化(RPGO)方法&#xff0c;利用现代技术进…

踩坑记录一

先呼自己两耳巴 临床采集的增强CT数据&#xff0c;有时候是同时采集了静脉期和动脉期。就会导致图像多一分如下&#xff1a; 但是勾画的时候&#xff0c;是以下面的期相进行标注的。所以在训练分割&#xff0c;对于这种案例&#xff0c;他识别到了在上面一个期相的目标位置&am…

【实战纪实】XSS漏洞+敏感信息泄露

前言&#xff1a; 前段时间看过一篇关于ZLMediakit漏洞的文章&#xff0c;就想着去试一下&#xff0c;结果真找到一个目标站点。详情往下看。 一、信息收集 fofa语法&#xff1a; "ZLMediaKit" &amp;&amp; org"China Education and Research Network …

【Orangepi Zero2 全志H616】驱动舵机控制 、Linux定时器(signal、setitimer)

一、SG90舵机开发 舵机基本介绍 二、Linux定时器 signal 函数setitimer 函数原型signal、setitimer函数API调用 三、舵机 软件PWM实现 一、SG90舵机开发 舵机基本介绍 如下图所示&#xff0c;最便宜的舵机sg90&#xff0c;常用三根或者四根接线&#xff0c;黄色为PWM信号控…

运用vioovi视与视标准工时工具,实现精益生产

在制造业领域&#xff0c;标准工时的测量和管理对于提高生产效率和降低成本至关重要。然而&#xff0c;传统的标准工时方法在面对日益增长的各种成本时显得力不从心。为了解决这一问题&#xff0c;企业需要采用一种更科学、更高效的方法来管理和优化生产流程。vioovi的视与视标…

分享一下报名缴费小程序怎么做

报名缴费小程序&#xff1a;一键解决你的报名难题 随着科技的飞速发展&#xff0c;微信小程序已经深入到我们生活的方方面面。从查询天气到预订餐厅&#xff0c;从购买电影票到预约健身教练&#xff0c;微信小程序几乎可以实现我们所有的日常需求。而今天&#xff0c;我们要为…

Verilog刷题[hdlbits] :Alwaysblock2

题目&#xff1a;Alwaysblock2 For hardware synthesis, there are two types of always blocks that are relevant: 对于硬件综合&#xff0c;有两种相关的always块&#xff1a; Combinational: always () 组合型&#xff1a;always ()Clocked: always (posedge clk) 时钟型…

文件下载(使用xhr)

第一种下载多种格式文档参数为拼接id get方法 import Cookies from js-cookie; // 下载 const fullNewName ref() const fileType ref() const onUpload async (row: any) > {fullNewName.value row.namefileType.value row.fileSuffixlet xhr new XMLHttpRequest();…

vue3中使用better-scroll

文章目录 需求分析安装htmlcssjs 需求分析 假设现在有这么一个需求&#xff0c;页面顶部有几个tabs导航&#xff0c;每一个tab下都有一个可以滑动的切换按钮。咱们就可以引入better-scroll来实现这个需求。 安装 首先下载better-scroll npm install better-scroll/core --…

汇编-变量

.386 .model flat,stdcall option casemap:none.data sum DWORD 0 ;创建一个全局变量&#xff0c;取名sum,初始化0 sum1 DWORD ? ;创建一个全局变量sum1,无初始化 ;问号(?)初始化值使得变量未被初始化&#xff0c;这意味着在运行时才会为该变量分配一个值 ;变量名…