堆的模板:使用一维数组实现小根堆,实现删除操作和堆顶元素输出功能

news/2024/12/22 20:18:22/

一、链接

838. 堆排序

二、题目

输入一个长度为 nn 的整数数列,从小到大输出 mm 小的数

输入格式

第一行包含整数 nn 和 mm。

第二行包含 nn 个整数,表示整数数列。

输出格式

共一行,包含 mm 个整数,表示整数数列中前 mm 小的数。

数据范围

1≤m≤n≤1051≤m≤n≤105,
1≤数列中元素≤1091≤数列中元素≤109

输入样例:

5 3
4 5 1 3 2

输出样例:

1 2 3

三、题意

其实使用排序函数就可以实现要求,但是这里是一个模板题目,主要是为了学习和练习一下模板,题目的意思是,输入一串数字,输出前m个最小的数字

四、代码

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

五、总结

1.堆是一个二叉树形状,我们这里的模板是使用一个一维数组来模拟实现小根堆,满足的性质是父节点小于左右孩子结点的数值。一维数组假设父节点是n,左孩子结点是n*2,右孩子结点是n*2+1,数组下标从1开始使用

2.首先定义一个down函数,表示一个数往下沉,如果这个数字比较大的话

3.实现down函数:用一个临时变量t保存需要下沉的数组下标u,进行两个条件判断,第一个条件判断比较左孩子和当前节点的数值,把比较小的下标存到t里面;第二个条件判断比较右孩子和当前结点的数值(临时变量t的那个结点),把比较小的下标存到t里面,其实就是看左右孩子结点里面有没有比父节点数值小的,如果有,就把那个孩子节点的下标存到临时变量t里面。如果临时变量t和当前下标u不相等,就交换两个数组元素,然后递归处理临时变量t.在上述过程中需要保证孩子节点存在,使用这部分代码进行实现

u*2<=cnt;
u*2+1<=cnt;

 cnt表示数组总长度 

4.输入需要的所有数据

5.建立堆:从中间开始,把元素往下沉,随着递归的进行,最后会自动建好一个堆,感觉是记住就好

for(int i=n/2;i;i--)    down(i);

6.每一次把堆顶元素输出,把堆的最后一个元素移到堆顶,然后把堆顶元素往下沉,实现删除原堆顶元素,经过m次,就可以实现题目的要求

7.堆还是比较简单的,越来越有信心了(bushi

8.如果条件判断或者什么循环只需要写一句话,可以不用写大括号,直接空一个 tab ,然后写一个语句,可能会更加美观。

 

六、精美图片

 


http://www.ppmy.cn/news/1010379.html

相关文章

基于SpringBoot+Vue的地方美食分享网站设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Docker 快速安装 MinIO

概述 MinIO 是一款基于Go语言的高性能对象存储服务&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 拉取docker镜像 docker pull minio/minio创建宿主机数据目录&#xff08;共享数据卷&#xff09; 此…

代码随想录算法训练营第38天| 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

今日学习的文章链接&#xff0c;或者视频链接 第九章 动态规划part01 自己看到题目的第一想法 看完代码随想录之后的想法 509 从上到下带memo的dp: class Solution { public:vector<int> memo;Solution() {memo vector<int>(31, -1);}int fib(int n) {retu…

【LeetCode每日一题】——807.保持城市天际线

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 中等 三【题目编号】 1572.矩阵对角线元素的和 四【题目描述】 给你一…

构建静态页面

1、将HelloWorld.vue的模板修改为 <template><div>hello, world</div> </template>2、将App.vue的模板修改为 <template><div id"app"><router-view/></div> </template>script中添加引入样式表 import ./…

LeetCode1732. 找到最高海拔

题干 有一个自行车手打算进行一场公路骑行&#xff0c;这条路线总共由 n 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。 给你一个长度为 n 的整数数组 gain &#xff0c;其中 gain[i] 是点 i 和点 i 1 的 净海拔高度差&#xff08;0 < i < n&#xff…

MySQL DCL 操作

文章目录 1.新建用户2.删除用户3.用户授权4.撤销用户权限5.查看用户权限6.修改用户密码7.权限类型参考文献 1.新建用户 连接到 MySQL 服务器后&#xff0c;管理员或特权用户可以使用 CREATE USER 语句创建新用户。 CREATE USER usernamehost IDENTIFIED BY password;# 示例 C…

2023华为OD机试真题Java实现【寻找最大价值的矿堆/深度优先搜索】

前言 本题使用Java实现,如果需要Python代码,请点击以下链接 点我 题目 我们规定,0表示空地,1表示银矿、2表示金矿,矿堆表示由相邻的金矿或银矿连接形成的地图。 银矿价值是1 ,金矿价值是2 ,你的目标是找出地图中最大价值的矿堆,并且输出该矿堆的价值 示例1 输入:…