算法------(10)堆

例题:(1)AcWing 838. 堆排序

        我们可以利用一个一维数组来模拟堆。由于堆本质上是一个完全二叉树,他的每个父节点的权值都小于左右子节点,而每个父节点编号为n时,左节点编号为2*n,右节点编号为2*n+1。用size记录堆的大小便于维护。在初始建立堆时,由于最后一层在前面每一层建立后自然而然就会被排序,因此我们只需要从倒数第二层开始建立到第一层即可。建立的过程利用到down操作,down操作本质上就是在父节点和两个子节点中进行比较换位,直到往下也不需要换位。而由于一维数组不方便删除头结点,但是删除尾节点只需要size--,因此我们删除头节点的操作就是把头结点和尾结点交换,然后把新的头节点down。 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int heap[N],sz;
void down(int u){int t = u;if(u*2<=sz&&heap[u*2] < heap[t]) t = u*2;if(u*2+1<=sz&&heap[u*2+1] < heap[t]) t = u*2+1;if(t!=u){swap(heap[t],heap[u]);down(t);}
}
int main()
{int n,m;scanf("%d%d", &n, &m);for(int i = 1;i<=n;i++){scanf("%d", &heap[i]);}sz = n;for(int i = n/2;i;i--){down(i);}while(m--){printf("%d ",heap[1]);heap[1] = heap[sz--];down(1);}return 0;
}

(2)AcWing 839. 模拟堆  

        模拟堆的过程相比上面多了几个操作:(1)删除第k个数,修改第k个插入的数,需要用一个记录下标-第k个插入的数和相反关系的两个数组进行维护。(2)还需要用up把下面的较小数往上移。 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
unordered_map<int,int> id,mp;//id的对应关系:下标-第k个插入的数,mp的对应关系: 第k个插入的数 - 下标 
int h[N];
int sz,cnt;
void down(int u){int t = u;if(u*2<=sz&&h[u*2]<h[t]) t = u*2;if(u*2+1<=sz&&h[u*2+1]<h[t]) t = u*2+1;if(t!=u){swap(mp[id[u]],mp[id[t]]);swap(id[u],id[t]);swap(h[u],h[t]);down(t);}
}
void up(int u){int t = u;if(u/2&&h[u/2]>h[t]) t = u/2;if(t!=u){swap(mp[id[u/2]],mp[id[u]]);swap(id[u/2],id[u]);swap(h[u/2],h[u]);up(t);}
}
int main()
{int n;scanf("%d", &n);for(int i = 0;i<n;i++){char op[5];scanf("%s",op);if(!strcmp(op,"I")){int x;scanf("%d", &x);h[++sz] = x;mp[++cnt] = sz;id[sz] = cnt;up(sz);}else if(!strcmp(op,"PM")){printf("%d\n",h[1]);}else if(!strcmp(op,"DM")){swap(mp[id[1]],mp[id[sz]]);swap(id[1],id[sz]);swap(h[1],h[sz]);sz--;down(1);}else if(!strcmp(op,"D")){int k;scanf("%d", &k);k = mp[k];swap(mp[id[k]],mp[id[sz]]);swap(id[k],id[sz]);swap(h[k],h[sz]);sz--;down(k);up(k);}else{int x,k;scanf("%d%d", &k, &x);k = mp[k];h[k] = x;down(k);up(k);}}return 0;
}

练习:(1)Leetcode 692.前k个高频单词         没做出来。。优先队列居然还能这么用的吗。。

         先用哈希表统计每个单词出现的次数,然后遍历哈希表(可以用auto直接循环),把每个<string,pair>加入到优先队列进行排序。最后由于需要按照字典序排序,我们还需要从后往前放置答案。

class Solution {
public:vector<string> topKFrequent(vector<string>& words, int k) {unordered_map<string,int> x;for(auto c:words){x[c]++;}auto cmp = [](const pair<string,int> &a,pair<string,int> &b){return a.second == b.second ? a.first < b.first : a.second > b.second;};priority_queue<pair<string,int>,vector<pair<string,int>>, decltype(cmp)> ans(cmp);for(auto c:x){ans.push(c);if(ans.size()>k) ans.pop();}vector<string> res(k);for(int i = k-1;i>=0;i--){res[i]=ans.top().first;ans.pop();}return res;}
};

(2)Leettcode 703.数据流中的第K大元素 

        一开始一直想靠sort。。没用。。

        由于优先队列只能访问队头数组,所以我们要让数据流中的第K大元素是优先队列的队头,因此我们要保证优先队列中只有K个数,这K个数中的最小的数就一定是第K大的数,也是优先队列的队头。

class KthLargest {
public:priority_queue<int,vector<int>,greater<int>> x;int k;KthLargest(int k, vector<int>& nums) {this->k = k;for(auto c:nums){x.push(c);if(x.size()>k) x.pop();}}int add(int val) {x.push(val);if(x.size()>k) x.pop();return x.top();}
};

(3) Leetcode 264.丑数II

        

        没做出来。。

        假如一个数为丑数,那么这个数的两倍,三倍和五倍对应的数也是丑数,当然这么做肯定会有重复,因此我们用一个哈希集合来存储出现过的数,这样保证小根堆里面不出现重复的数,因此第k次取出来的数就是第k个丑数。

class Solution {
public:long nthUglyNumber(int n) {priority_queue<long,vector<long>,greater<long>> x;unordered_set<int> y;x.push(1);y.insert(1);for(int i = 0;i<n-1;i++){long k = x.top();x.pop();if(!y.count(k*2)){x.push(k*2);y.insert(k*2);}if(!y.count(k*3)){x.push(k*3);y.insert(k*3);}if(!y.count(k*5)){x.push(k*5);y.insert(k*5);}}return x.top();}
};

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

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

相关文章

kubeSphere DevOps自定义容器 指定nodejs版本

✨✨✨✨✨✨ &#x1f380;前言&#x1f381;基于内置镜像构建&#x1f381;把镜像添加基础容器中&#x1f381;检查容器是否配置成功&#x1f381;不生效的原因排查&#x1f381;按步骤执行如下命令 &#x1f380;前言 由于我本地的开发环境node是16.18.1,而自带容器node的版…

VUE项目目录与运行流程(VScode)

各目录对应名称含义 main.js&#xff08;导入App.vue&#xff0c;基于App.vue创建结构渲染index.html&#xff09; //核心作用&#xff1a;导入App.vue&#xff0c;基于App.vue创建结构渲染index.html//1.导入Vue核心包 import Vue from vue//2.导入App.vue根组件 import App f…

MSB20M-ASEMI小功率家电专用MSB20M

编辑&#xff1a;ll MSB20M-ASEMI小功率家电专用MSB20M 型号&#xff1a;MSB20M 品牌&#xff1a;ASEMI 封装&#xff1a;UMSB-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;2A 功率(Pd)&#xff1a;50W 芯片个数&#xff1a;4 引…

20240122面试练习题10

1. Redis为什么执行这么快&#xff1f; 二、Redis为什么这么快&#xff1f; 1、完全基于内存&#xff0c;数据存在内存中&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;非常快速&#xff0c;跟传统的磁盘文件数据存储相比&#xff0c;避免了通过磁盘IO读取到内存这部分…

微软 AD |域控制器 | 组件 | 域服务 | 对象解析

介绍 Active Directory&#xff08;AD&#xff09;&#xff0c;是微软的目录服务&#xff0c;提供强大的功能和管理体系&#xff0c;用于组织管理和安全存储网络上的资源和用户、计算机、服务对象等信息。 AD 功能&#xff1a; 身份验证和访问控制&#xff1a; 提供集中式的身…

Kubernets Deployment详解

因为Pod生命周期是短暂的&#xff0c;一旦运行完成则立即回收&#xff0c;且涉及Pod的创建、自愈、删除等操作比较复杂&#xff0c;所以很少在Kubernetes中直接使用Pod。而是使用更高级的称为Controller&#xff08;控制器&#xff09;的抽象层&#xff0c;来完成对Pod的创建、…

为什么时序逻辑电路会落后一拍?

1、时序逻辑电路落后一拍&#xff1f; FPGA初学者可能经常听到一句话&#xff1a;“时序逻辑电路&#xff0c;或者说用 < 输出的电路会延迟&#xff08;落后&#xff09;一个时钟周期。”但在仿真过程中经常会发现不符合这一“定律”的现象–明明是在仿真时序逻辑&#xff…

工业4.0开放平台通信 统一架构OPC UA的一种测试方法

工业4.0和工业物联网&#xff08;Industrial Internet of Things, IIoT&#xff09;的核心挑战在于设备、机器以及来自不同行业服务之间的安全和标准化的数据和信息交换。 2016年11月工业4.0平台发布了指导纲要《工业4.0产品需要实现哪些准则》&#xff0c;即对于所有位于工业…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-Tag标签管理实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

1174:长整数排序(指针专题)

题目描述 长整数排序。输入n 然后输入n个位数不超过100位的大整数&#xff0c;输入的整数可能含有前导0。将这n个长整数排序后输出&#xff0c;输出不含前导0。int greater(char *s1, char *s2){若s1指向的整数大于s2指向的整数&#xff0c;返回一个正整数;若s1指向的整数小于s…

看门狗定时器

1. 看门狗 看门狗: 用于设备在 程序异常(死机) 时 可以自动重启设备 实现原理: 通过定时器 进行定时 , 在定时器时间结束前 进行 "喂狗" 重置定时器时间 若时间到,还没有"喂狗",系统重启 本质就是一个定时器, 如何定时? 定时器 本质是对 晶振时钟进行 计…

Leetcode—144. 二叉树的前序遍历【简单】

2023每日刷题&#xff08;九十六&#xff09; Leetcode—144. 二叉树的前序遍历 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr…

物业app开发成功案例:如何满足用户需求

在当今数字化时代&#xff0c;物业管理已经不再是一个简单的领域。随着智能手机的普及和移动互联技术的发展&#xff0c;许多物业管理公司纷纷投入物业App开发&#xff0c;以提升管理效率、改善用户体验。本文将介绍一个成功的案例&#xff0c;探讨如何满足用户需求。 物业App…

vue —— h函数的学习与使用

文章目录 一、h函数是什么&#xff1f;二、h函数格式说明及使用示例1&#xff1a;简单创建一个VNode&#xff08;vue3&#xff09;示例2&#xff1a;vue2中h函数用法示例3&#xff1a;vue3中h函数的用法vue2和vue3中h函数的区别&#xff1f; 三、h函数实现原理四、h函数常用场景…

800G光传输网络中的相干调制与PAM4技术

在800G光传输网络架构中&#xff0c;相干调制技术和PAM4&#xff08;四电平脉冲幅度调制&#xff09;技术各具优势&#xff0c;分别针对不同应用场景提供高效解决方案。 相干调制是高级光通信的核心技术之一&#xff0c;它通过精密操控光载波的频率、相位和振幅来编码信息&…

HMI-Board以太网数据监视器(二)MQTT和LVGL

E ∫ d E ∫ k d q r 2 k L ∫ d q r 2 E \int dE \int \frac{kdq}{r^2} \frac{k}{L} \int \frac{dq}{r^2} E∫dE∫r2kdq​Lk​∫r2dq​ E Q 2 π ϵ L 2 E \frac{Q}{2\pi\epsilon L^2} E2πϵL2Q​ Γ ( n ) ( n − 1 ) ! ∀ n ∈ N \Gamma(n) (n-1)!\quad\forall n…

JavaScript 学习笔记(WEB APIs Day4)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

C#使用RabbitMQ-1_Docker部署并在c#中实现简单模式消息代理

介绍 RabbitMQ是一个开源的消息队列系统&#xff0c;实现了高级消息队列协议&#xff08;AMQP&#xff09;。 &#x1f340;RabbitMQ起源于金融系统&#xff0c;现在广泛应用于各种分布式系统中。它的主要功能是在应用程序之间提供异步消息传递&#xff0c;实现系统间的解耦和…

pytorch学习笔记(十一)

优化器学习 把搭建好的模型拿来训练&#xff0c;得到最优的参数。 import torch.optim import torchvision from torch import nn from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoaderdataset torchvision.datas…

uniapp安卓android离线打包本地打包整理

离线打包准备 下载Android studio 1.准备资源hbuilder 2.准备离线SDK 最新android平台SDK下载最新android平台SDK下载 3.离线打包key申请 4.直接导入HBuilder-Integrate-AS工程,直接运行simpleDemo项目即可 5.安装java 1.8 jdk-8u151-windows-x64 6.遇到这个报错报错Caus…