[仓颉Cangjie刷题模板] 优先队列(含小顶堆实现)

@[TOC]([仓颉Cangjie刷题模板] 优先队列(含小顶堆实现) )

一、 算法&数据结构

1. 描述

堆是一个可以维护实时最大/最小值的数据结构,相比treeset等常数优很多。
常用于维护一组数据的极值贪心问题。

2. 复杂度分析

  1. 初始化O(n)
  2. 查询O(1)
  3. 修改O(lgn)

3. 常见应用

  1. Dijkstra
  2. 丑数II
  3. 3D接雨水

4. 常用优化

  1. 本文模板实现的是小顶堆,要用大顶堆可以取反。
  2. 注意经常要用的元组,在仓颉里不能比大小,因此可以用数组代替,并实现扩展排序(但是很麻烦);或者自己实现元组(pair等)

二、 模板代码

1. 丑数

在这里插入图片描述

例题: 264. 丑数 II

按照从小到大的顺序枚举每个丑数可以派生的丑数,那么第k次出堆的那个就是答案。


extend<T> Array<T> where T <: Less<T> {operator func <(rhs: Array<T>): Bool {for (i in 0..min(size, rhs.size)) {if (this[i] < rhs[i]) {return true}}return this.size < rhs.size}// public func equals(other: Array<T>){//     return true// }
}
class MinHeap<T> <: Collection<T> where T <: Less<T> {public prop size: Int {get() {h.size}}protected var h = ArrayList<T>()public init() {           }   public init(items: Collection<T>) {h.appendAll(items)for (i in (h.size/2)..=0:-1) {_siftup(i)}        }public func isEmpty() {return h.isEmpty()}public func iterator() {throw Exception("No Iterator for MinHeap")// return h.iterator()}public func heappush(v:T) {h.append(v)var i = h.size - 1while (i > 0 &&  v < (h[(i-1) >> 1])) {  // 比父节点小,则上移h[i] = h[(i-1) >> 1]i = (i-1) >> 1}h[i] = v}public func heappop() {// let last = h.remove(h.size-1)// if (h.size == 0) {//     return last// }// let ret = h[0]// h[0] = last // _siftup(0)// return retlet ret = h[0]h[0] = h[h.size-1]h.remove(h.size-1)if (!h.isEmpty()) {_siftup(0)}return ret}public func heapreplace(v:T) {  // 替换并返回堆顶let ret = h[0]h[0] = v _siftup(0)return ret}public func heappushpop(v:T) {  // 把v和堆顶保留更大的那个,pop返回更小的那个;常用语保留最大的k个值(小顶堆)if (!h.isEmpty() && h[0] < v) {let ret = h[0]h[0] = v return ret}         return v}private func _siftup(i:Int64){// 把i位置的大值下沉,小儿子提上来var fa = ilet v = h[fa]let n = h.size while ( (fa << 1 | 1) < n) {  // 有左儿子var child = fa << 1 | 1 let right = child + 1if (right < n && h[right] < h[child]) {child = right }if (h[child] < v) {h[fa] = h[child]  // 小的儿子上移fa = child  // 迭代} else {break}}if (fa != i) {  // 有变化h[fa] = v}} 
}
extend<T> MinHeap<T> <: ToString where T <: ToString {public func toString() {         return h.toString()      }
}
public class Solution {public func nthUglyNumber(n: Int64): Int64 {let h = MinHeap<Int64>([1])let vis = HashSet<Int64>();let q = [2,3,5]for (_ in 0..n-1) {let v = h.heappop()for (i in q) {let p = i*vif (vis.contains(p)) {continue}vis.put(p)h.heappush(p)}}return h.heappop()}
}

2. Dijkstra模板体

例题: 743. 网络延迟时间

跑一遍Dij,距离最大的就是答案


import std.collection.*
import std.math.*class MinHeap<T> <: Collection<T> where T <: MyLess<T> {public prop size: Int {get() {h.size}}protected var h = ArrayList<T>()public init() {           }   public init(items: Collection<T>) {h.appendAll(items)for (i in (h.size/2)..=0:-1) {_siftup(i)}        }public func isEmpty() {return h.isEmpty()}public func iterator() {throw Exception("No Iterator for MinHeap")// return h.iterator()}public func heappush(v:T) {h.append(v)var i = h.size - 1while (i > 0 &&  v < (h[(i-1) >> 1])) {  // 比父节点小,则上移h[i] = h[(i-1) >> 1]i = (i-1) >> 1}h[i] = v}public func heappop() {// let last = h.remove(h.size-1)// if (h.size == 0) {//     return last// }// let ret = h[0]// h[0] = last // _siftup(0)// return retlet ret = h[0]h[0] = h[h.size-1]h.remove(h.size-1)if (!h.isEmpty()) {_siftup(0)}return ret}public func heapreplace(v:T) {  // 替换并返回堆顶let ret = h[0]h[0] = v _siftup(0)return ret}public func heappushpop(v:T) {  // 把v和堆顶保留更大的那个,pop返回更小的那个;常用语保留最大的k个值(小顶堆)if (!h.isEmpty() && h[0] < v) {let ret = h[0]h[0] = v return ret}         return v}private func _siftup(i:Int64){// 把i位置的大值下沉,小儿子提上来var fa = ilet v = h[fa]let n = h.size while ( (fa << 1 | 1) < n) {  // 有左儿子var child = fa << 1 | 1 let right = child + 1if (right < n && h[right] < h[child]) {child = right }if (h[child] < v) {h[fa] = h[child]  // 小的儿子上移fa = child  // 迭代} else {break}}if (fa != i) {  // 有变化h[fa] = v}} 
}
interface MyLess<T> {operator func <(rhs: T): Bool
}
extend<T> Array<T> <: MyLess<Array<T>> where T <: Less<T> { public operator func <(rhs: Array<T>): Bool {for (i in 0..min(size, rhs.size)) {if (this[i] < rhs[i]) {return true} else if (rhs[i] < this[i]) {return false}}return this.size < rhs.size}// public func equals(other: Array<T>){//     return true// }
}
extend<T> MinHeap<T> <: ToString where T <: ToString {public func toString() {         return h.toString()      }
}public class Solution {public func networkDelayTime(times: Array<Array<Int64>>, n: Int64, k: Int64): Int64 {let g = Array(n, {_=>ArrayList<(Int64,Int64)>()})for (e in times) {let (u,v,w) = (e[0],e[1],e[2])g[u-1].append((v-1,w))}let dis = Array(n, {_=>Int64.Max})dis[k-1] = 0let h = MinHeap([[0,k-1]])while (!h.isEmpty()) {let arr = h.heappop()let (c, u) = (arr[0],arr[1])if (c > dis[u]) {continue}for (e in g[u]){let (v, w) = (e[0],e[1])if (c + w < dis[v]) {dis[v] = c+w h.heappush([c+w,v])}}}let ans = max(dis).getOrThrow()return  if (ans == Int64.Max){-1} else {ans}}
}

三、其他

  1. 堆本质是一种贪心,因此在很多场景都有应用。比如区间离线问题

四、更多例题

五、参考链接

  • [python刷题模板] 单调队列

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

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

相关文章

解决 MySQL 5.7 安装中的常见问题及解决方案

目录 前言1. 安装MySQL 5.7时的常见错误分析1.1 错误原因及表现1.2 错误的根源 2. 解决方案2.1 修改YUM仓库配置2.2 重新尝试安装2.3 处理GPG密钥错误2.4 解决依赖包问题 3. 安装成功后的配置3.1 启动MySQL服务3.2 获取临时密码3.3 修改root密码 4. 结语 前言 在Linux服务器上…

计算机网络 网络安全基础——针对实习面试

目录 网络安全基础你了解被动攻击吗&#xff1f;你了解主动攻击吗&#xff1f;你了解病毒吗&#xff1f;说说基本的防护措施和安全策略&#xff1f; 网络安全基础 网络安全威胁是指任何可能对网络系统造成损害的行为或事件。这些威胁可以是被动的&#xff0c;也可以是主动的。…

oracle小技巧-解决特殊密码字符而导致的exp错误

在使用oracle数据库的时候&#xff0c;我们经常会利用exp工具对某些表进行导出。但有些时候&#xff0c;因我们用户密码为安全性设有特殊字符&#xff0c;导致exp导出时候报&#xff1a;“EXP-00056和ORA-12154”&#xff0c;今天我们就分享下如何通过设置符号隔离的小技巧解决…

Taro 鸿蒙技术内幕系列(三) - 多语言场景下的通用事件系统设计

基于 Taro 打造的京东鸿蒙 APP 已跟随鸿蒙 Next 系统公测&#xff0c;本系列文章将深入解析 Taro 如何实现使用 React 开发高性能鸿蒙应用的技术内幕 背景 在鸿蒙生态系统中&#xff0c;虽然原生应用通常基于 ArkTS 实现&#xff0c;但在实际研发过程中发现&#xff0c;使用 C…

带有悬浮窗功能的Android应用

android api29 gradle 8.9 要求 布局文件 (floating_window_layout.xml): 增加、删除、关闭按钮默认隐藏。使用“开始”按钮来控制这些按钮的显示和隐藏。 服务类 (FloatingWindowService.kt): 实现“开始”按钮的功能&#xff0c;点击时切换增加、删除、关闭按钮的可见性。处…

ML 系列:第 36 节 — 统计学中的抽样类型

ML 系列&#xff1a;第 36 天 — 统计学中的抽样类型 文章目录 一、说明二、抽样方法三、简单随机抽样四、 Stratified Sampling分层抽样五、 Cluster Sampling 整群抽样六、Systematic Sampling系统抽样七、Convenience Sampling便利抽样八、结论 一、说明 统计学中的抽样类型…

CGMA – Cloth Creation and Simulation for Real-Time

CGMA – 实时布料创建和模拟 Info&#xff1a; 本课程介绍如何将 Marvelous Designer 整合到布料工作流程中以实时创建角色&#xff0c;从软件基础知识到创建逼真和风格化服装的高级技术。本课程将首先介绍软件&#xff0c;通过创建现代、现代的服装&#xff0c;然后深入探讨使…

Springboot组合SpringSecurity安全插件基于密码的验证Demo

Springboot组合SpringSecurity安全插件基于密码的验证Demo!下面的案例&#xff0c;都是基于数据库mysql&#xff0c;用户密码&#xff0c;验证登录的策略demo。 1&#xff1b;引入maven仓库的坐标 <dependency><groupId>org.springframework.boot</groupId>…

从Full-Text Search全文检索到RAG检索增强

从Full-Text Search全文检索到RAG检索增强 时光飞逝&#xff0c;转眼间六年过去了&#xff0c;六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目&#xff0c;铁蛋也从最开始做CRUD转行去了大数据平台开发&#xff0c;混迹包装开源的业务&#xff0c;机缘巧合下做了实时…

单片机学习笔记 8. 矩阵键盘按键检测

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘 目录 0、实现的…

【AI日记】24.11.26 聚焦 kaggle 比赛

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 1 内容&#xff1a;研究 kaggle 比赛时间&#xff1a;3 小时 核心工作 2 内容&#xff1a;学习 kaggle 比赛 Titanic - Machine Learning from Disaster时间&#xff1a;4 小时备注&#xff1a;这…

排序算法2

排序算法1-CSDN博客 排序算法1中提及的是较为基础(暴力实现&#xff0c;复杂度较高)的排序算法&#xff0c;不适合于数据量较大的场景&#xff0c;比如序列长度达到1e5 接下来以蓝桥另一道题目来理解其它的排序算法 蓝桥3226 蓝桥账户中心 样例 5 1 5 9 3 7 4、快速排序 快速排…

【数据结构实战篇】用C语言实现你的私有队列

&#x1f3dd;️专栏&#xff1a;【数据结构实战篇】 &#x1f305;主页&#xff1a;f狐o狸x 在前面的文章中我们用C语言实现了栈的数据结构&#xff0c;本期内容我们将实现队列的数据结构 一、队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端…

macos 14.0 Monoma 修改顶部菜单栏颜色

macos 14.0 设置暗色后顶部菜单栏还维持浅色&#xff0c;与整体不协调。 修改方式如下&#xff1a;

长三角文博会:Adobe国际认证体系推动设计人才评价新标准

2024年11月22日&#xff0c;由上海、江苏、浙江、安徽三省一市党委宣传部共同发起的第五届长三角文化博览会&#xff08;简称“长三角文博会”&#xff09;在上海国家会展中心盛大启幕。长三角文博会自2018年起已成功举办多届&#xff0c;已成为展示区域文化产业发展成果、推动…

安装数据库客户端工具

如果没有勾选下面的&#xff0c;可以运行下面的两个命令 红框为自带数据库 新建数据库 右键运行mysql文件&#xff0c;找到数据库&#xff0c;并刷新

SQL 复杂查询

目录 复杂查询 一、目的和要求 二、实验内容 &#xff08;1&#xff09;查询出所有水果产品的类别及详情。 查询出编号为“00000001”的消费者用户的姓名及其所下订单。&#xff08;分别采用子查询和连接方式实现&#xff09; 查询出每个订单的消费者姓名及联系方式。 在…

Angular面试题汇总系列一

1. 如何理解Angular Signal Angular Signals is a system that granularly tracks how and where your state is used throughout an application, allowing the framework to optimize rendering updates. 什么是信号 信号是一个值的包装器&#xff0c;可以在该值发生变化时…

ES 和Kibana-v2 带用户登录验证

1. 前言 ElasticSearch、可视化操作工具Kibana。如果你是Linux centos系统的话&#xff0c;下面的指令可以一路CV完成服务的部署。 2. 服务搭建 2.1. 部署ElasticSearch 拉取docker镜像 docker pull elasticsearch:7.17.21 创建挂载卷目录 mkdir /**/es-data -p mkdir /**/…

【踩坑】git中文乱码问题

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景说明 使用git diff显示中文乱码&#xff0c;如&#xff1a; 修复方法 执行一次&#xff1a; export LESSCHARSETutf-8 如果需要下次登录免输入…