【LeetCode】升级打怪之路 Day 13:优先级队列的应用

今日题目:

  • 23. 合并 K 个升序链表 | LeetCode
  • 378. 有序矩阵中第 K 小的元素 | LeetCode
  • 373. 查找和最小的 K 对数字 | LeetCode
  • 703. 数据流中的第 K 大元素 | LeetCode
  • 347. 前 K 个高频元素 | LeetCode

目录

    • Problem 1:合并多个有序链表 【classic】
      • LC 23. 合并 K 个升序链表 ⭐⭐⭐⭐⭐
      • LC 378. 有序矩阵中第 K 小的元素
      • LC 373. 查找和最小的 K 对数字 【略有难度】
    • Problem 2:寻找第 k 个最大元素
      • LC 703. 数据流中的第 K 大元素 【classic】 ⭐⭐⭐⭐⭐
      • LC 347. 前 K 个高频元素 【easy】

优先级队列的特色是动态排序,插入的元素可以自动维护正确的顺序。其限制就是,优先级队列的限制是只能从队头和队尾操作元素。

一般来说,用到优先级队列的题目主要分两类:

  1. 一类是合并多个有序链表这类题
  2. 另一类是寻找第 k 个最大元素这类题

这两类题目都是经典题型,需要理解。

Problem 1:合并多个有序链表 【classic】

有很多题目在使用优先级队列时,解题思路都可以归结于“合并多个有序链表”,这里先学会使用 PriorityQueue 来解决合并多个有序链表的问题,再看看有哪些变形。

LC 23. 合并 K 个升序链表 ⭐⭐⭐⭐⭐

23. 合并 K 个升序链表 | LeetCode

这个题目可以用双指针法,但使用优先级队列更能解决这一大类问题。

这种题的基本思路就是:将每个链表的头节点入队,然后开始迭代,每轮迭代中,从队列中拿出堆顶元素(即最小元素),然后把这个节点的 next 节点入队,进入下一轮迭代。直到合并结束。

这种解题思路很巧妙地运用了各链表“升序”的特点以及优先级队列的好处。

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length == 0) {
            return null;
        }
        
        PriorityQueue<ListNode> queue = new PriorityQueue<>(lists.length, (a, b) -> (a.val - b.val));
        ListNode vHead = new ListNode();
        ListNode curr = vHead;

        // 将各链表的头节点放入队列中
        for (var node: lists) {
            if (node != null) {
                queue.offer(node);
            }
        }

        while (!queue.isEmpty()) {
            var min = queue.poll();  // 获取当前堆中最小元素节点
            curr.next = min;
            curr = curr.next;
            if (min.next != null) {
                queue.offer(min.next);
            }
        }

        return vHead.next;
    }
}

LC 378. 有序矩阵中第 K 小的元素

378. 有序矩阵中第 K 小的元素 | LeetCode

这个题是上面“合并 K 个升序链表”的变形题,因为矩阵的每一行都是升序的,可以将矩阵的每一行视为一个升序链表,这样解题思路就与之前的是一样了,难度不大。

LC 373. 查找和最小的 K 对数字 【略有难度】

373. 查找和最小的 K 对数字 | LeetCode

一开始做这个题,没有想到如何使用 PriorityQueue,也没有将这个题转换到“合并 K 个升序链表”这个基本问题的思路上,导致出现多次提交错误。这个题目本质上还是合并 K 个升序链表的变形

这个题目可以这样想象将其转换为 K 个有序链表:将固定一个 nums1[i] 与 nums2 的各个元素进行相加,就可以一串升序的结果。所以每个 nums1 的元素可以按照上面这种方式得到一个链表,那么这个问题就转换为了 nums1.length 个升序链表的合并问题了。

举例子可以参考 labuladong 的讲解:

在这里插入图片描述

想清楚思路之后,难度也就还行了。

Problem 2:寻找第 k 个最大元素

这是 PriorityQueue 的另一个经典应用。直接通过题目来看一下。

LC 703. 数据流中的第 K 大元素 【classic】 ⭐⭐⭐⭐⭐

703. 数据流中的第 K 大元素 | LeetCode

这个题目是经典的利用 PriorityQueue 来寻找第 k 个最大元素的问题。

PriorityQueue 来寻找 Top K 的方法与排序等方法的关键区别在于:只找到 Top K,不排序 Top K

因为如果使用排序法的话,就是对所有元素排序,然后就可以找到 top K 了,但是使用 priority queue 的话,Top K 的 K 个元素的顺序都是可以不用排出来的。

解题思路:

top-k

来源:拜托,面试别再问我TopK了!!!

这里可以得到一个经验:保持小根堆一直为 K 的元素,就可以保证这 K 个元素是一个数据流的最大的 K 的元素,因为比他们小的元素都被 pop 出去了,因为小根堆的顶端是最小元素,所以每次 pop 出去的一定是最小元素。

代码实现:

class KthLargest {

    private int k;

    private PriorityQueue<Integer> heap;

    public KthLargest(int k, int[] nums) {
        this.k = k;
        this.heap = new PriorityQueue<>(k + 1);
        for (int num: nums) {
            heap.offer(num);
            if (heap.size() > k) {
                heap.poll();  // pop 出最小元素
            }
        }
    }
    
    public int add(int val) {
        heap.offer(val);
        while (heap.size() > k) {
            heap.poll();  // pop 出最小元素
        }
        return heap.peek();  // 堆中是最大的 K 个元素,堆顶就是这个 K 个元素中最小的那个,也就是第 K 大的元素
    }
}

LC 347. 前 K 个高频元素 【easy】

347. 前 K 个高频元素 | LeetCode

循环队列的经典应用,难度不大。

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

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

相关文章

2核4G服务器支持多少人在线?腾讯云全访问测试

腾讯云轻量应用服务器2核4G5M配置一年优惠价165元、252元15个月、三年756元&#xff0c;100%CPU性能&#xff0c;5M带宽下载速度640KB/秒&#xff0c;60GB SSD系统盘&#xff0c;月流量500GB&#xff0c;折合每天16.6GB流量&#xff0c;超出月流量包的流量按照0.8元每GB的价格支…

WSL2安装Ubuntu18.04到指定路径(非C盘)

1 系统设置开启WSL 1.1 在搜索框搜索“启动或关闭Windows功能”或在“控制面板”->“程序”->“启用或关闭 windows 功能” 开启 Windows 虚拟化和 Linux 子系统&#xff08;WSL2)以及Hyper-V 按照提示重启计算机&#xff0c;开启WSL。 2 将WSL2 设置为默认版本 wsl --se…

Mysql删除重复项:力扣196. 删除重复的电子邮箱

题目链接&#xff1a;196. 删除重复的电子邮箱 - 力扣&#xff08;LeetCode&#xff09; 题目描述 sql语句 # Write your MySQL query statement below delete a from person as a inner join person as b where a.email b.email and a.id > b.id 思路&#xff1a;内连接…

MySQL NDB Cluster 分布式架构搭建 自定义启动、重启和关闭集群Shell脚本

此次NDB Cluster使用三台虚拟机进行搭建&#xff0c;一台作为管理节点&#xff1b;而对于另外两台服务器&#xff0c;每一台都充当着数据节点和SQL节点的角色。注意不是MGR主从复制架构&#xff0c;而是分布式MySQL架构。 创建 /var/lib/mysql-cluster/config.ini Cluster全局…

uipath调用python代码获取网站验证码

用uipath自带的ocr读验证码不是很准确&#xff0c;选择调用python读验证码&#xff0c;需要导入ddddocr&#xff08;3.8以下版本支持ddddocr&#xff09; 用uipath程序将验证码图片保存到本地&#xff08;也可以直接用python处理图片&#xff0c;保存到本地比较简单&#xff0…

xss.haozi.me:0X0D

alert(1) -> 记住要回车一下-->是js的一个注释符但是只能用在最前面前面有一个空格都不行

C++:String的模拟实现

模拟实现的节奏比较快&#xff0c;大家可以先去看看博主的关于string的使用&#xff0c;然后再来看这里的模拟实现过程 C&#xff1a;String类的使用-CSDN博客 String模拟实现大致框架迭代器以及迭代器的获取&#xff08;public定义&#xff0c;要有可读可写的也要有可读不可写…

基于springboot+vue的医院药品管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【Android】源码解析 Activity 的构成

本文是基于 Android 14 的源码解析。 当我们写 Activity 时会调用 setContentView() 方法来加载布局。现在来看看 setContentView() 方法是怎么实现的&#xff0c;源码如下所示&#xff1a; 路径&#xff1a;/frameworks/base/core/java/android/app/Activity.javapublic void…

Linux中服务端开发

1 创建socket,返回一个文件描述符lfd---socket(); 2 将lfd和IP&#xff0c;PROT进行绑定---bind(); 3 将lfd由主动变成被动监听---listen(); 4 接收一个新的连接&#xff0c;得到一个的文件描述符cfd--accept() --该文件描述符用于与客户端通信 5 while(1) { 接受数据&a…

【扩散模型系列3】DiT开源项目

文章目录 DiT原始项目Fast-DiT readmeSamplingTraining训练之前的准备训练DiTPyTorch 训练结果改进训练效果 Evaluation (FID, Inception Score, etc.) 总结 DiT原始项目 该项目仅针对DiT训练&#xff0c;并未包含VAE 的训练 项目地址 论文主页 Fast-DiT readme 该项目仅针…

性能优化篇(七) UI优化注意事项以及使用Sprite Atlas打包精灵图集

UI优化注意事项 1.尽量避免使用IMGUI(OnGUI)来做游戏时的UI&#xff0c;因为IMGUI的开销比较大。 2.如果一个UGUI的控件不需要进行射线检测&#xff0c;则可以取消勾选Raycast Target 3.尽量避免使用完全透明的图片和UI控件。因为即使完全透明&#xff0c;我们看不见它&#xf…

论文笔记:Code Llama: Open Foundation Models for Code

导语 Code Llama是开源模型Llama 2在代码领域的一个专有模型&#xff0c;作者通过在代码数据集上进行进一步训练得到了了适用于该领域的专有模型&#xff0c;并在测试基准中超过了同等参数规模的其他公开模型。 链接&#xff1a;https://arxiv.org/abs/2308.12950机构&#x…

[cg] Games 202 - NPR 非真实感渲染

NPR特性&#xff08;基于真实感渲染&#xff09; 真实感--》翻译成非真实感的过程 NPR风格 需要转换为渲染中的操作 1.描边 B-->普通边界&#xff08;不是下面几种的&#xff09; C-->折痕 M-->材质边界 S-->需要在物体外面一圈上&#xff0c;并且是多个面共享…

win11部署自己的privateGpt(2024-0304)

什么是privateGpt? privategpt开源项目地址 https://github.com/imartinez/privateGPT/tree/main 官方文档 https://docs.privategpt.dev/overview/welcome/welcome PrivateGPT是一个可投入生产的人工智能项目&#xff0c;利用大型语言模型&#xff08;LLMs&#xff09;的…

流行 NFT 的必备指南

​作者&#xff1a;stellafootprint.network 编译&#xff1a;mingfootprint.network 来源&#xff1a;Footprint Analytics Blog 随着爱好者们对 NFT 的兴趣不断高涨&#xff0c;Footprint Analytics 发布了一系列文章&#xff0c;重点介绍各种热门 NFT 系列。这些文章深入…

GBU808-ASEMI整流桥GBU808参数、封装、尺寸

编辑&#xff1a;ll GBU808-ASEMI整流桥GBU808参数、封装、尺寸 型号&#xff1a;GBU808 品牌&#xff1a;ASEMI 封装&#xff1a;GBU-4 最大重复峰值反向电压&#xff1a;800V 最大正向平均整流电流(Vdss)&#xff1a;8A 功率(Pd)&#xff1a;中小功率 芯片个数&#…

【网站项目】075学生信息管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

xss.haozi.me:0x0B

<svg><script>(1)</script>

WebSocket 详解教程

概述 WebSocket 是什么&#xff1f; WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 为什么需要 WebSocket &#xff1f; 了解计算机网络协议的人&#xff0c;应该都知道&#x…