堆专题1 向下调整构建大顶堆

news2024/9/24 7:22:03

题目:

样例:

输入
6
3 2 6 5 8 7
输出
8 5 7 3 2 6

思路:

        堆,是一颗完全二叉树,树中每个节点的值都不小于(或不大于)其左右孩子结点的值。

其中,

父结点大于或者等于孩子结点的值,称为大顶堆

父结点小于或者等于孩子结点的值,称为小顶堆

由于堆,是一颗完全二叉树,所以,我们可以将该完全二叉树压缩成 一维数组进行存储。

其中,第一个结点 存储于数组中的 1 号位,并且数组 i 号位 表示的结点的左孩子就是 2i 号位,而右孩子则是(2i + 1)号位。

向下调整堆,就是从 顶部的 根节点 向下调整到 叶子结点。

代码详解如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>
#define endl '\n'
#define x first
#define y second
#define mk make_pair
#define int long long
#define NO puts("NO")
#define YES puts("YES")
#define umap unordered_map
#define INF 0x3f3f3f3f
#define All(x) (x).begin(),(x).end()
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10,M = 500;
using PII = pair<int,int>;

int n;

umap<int,int>heap;  // 可以用哈希表作为 heap ,即有效率,又可以根据题意的数组大小变化

inline void downAdjust(int low,int high)
{
    int i = low,j = i * 2;    // i 为欲调整的结点,由于是父结点开始调整所以是 i = low , j 为 左孩子

    // j 没有到达叶子结点,就向下调整
    while(j <= high)
    {
        // 如果存在右孩子,并且右孩子比左孩子大,我们调整右孩子
        if(j + 1 <= high && heap[j + 1] > heap[j])
        {
            ++j;
        }
        // 如果孩子结点 比 父结点 大  就向上调整
        if(heap[j] > heap[i])
        {
            swap(heap[j] , heap[i]);    // 交换结点数值
            i = j;  // 交换调整结点下标
            j = i * 2;  // 更新调整结点 的 孩子结点下标
        }else  break;
    }
}

inline void solve()
{	
	cin >> n;

    // 输入原始堆位
    for(int i = 1;i <= n;++i) cin >> heap[i];

    // 这里 n / 2 是 保证每个结点都是以其为父结点的子树中的权值最大的结点 进行向下调整
    for(int i = n / 2;i;--i) downAdjust(i,n);

    // 输出 调整后的堆
    for(int i = 1;i <= n;++i)
    {
        if(i > 1) cout << ' ';
        cout << heap[i];
    }
}
signed main()
{
//	freopen("a.txt", "r", stdin);
	___G;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

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

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

相关文章

8+纯生信,多组机器学习+分型探讨黑色素瘤发文思路。

今天给同学们分享一篇泛癌多组机器学习分型的生信文章“Comprehensive characterisation of immunogenic cell death in melanoma revealing the association with prognosis and tumor immune microenvironment”&#xff0c;这篇文章于2022年9月23日发表在Front Immunol 期刊…

国际数学教材扫盲知识(持续更新中)

缩写 A-LEVEL&#xff08;大学预科&#xff09;&#xff1a;General Certificate of Education Advanced Level AP&#xff1a;Advanced Placement&#xff08;美国地区&#xff1a;美高AP&#xff09; GCSE&#xff1a;General Certificate of Secondary Education&#xf…

ubuntu下使用gcc编译c程序: “error: stray ‘\357’ in program“

现象&#xff1a; ubuntu下使用gcc编译c程序: “error: stray ‘\357’ in program“ 尝试查找原因&#xff1a;打开从windos直接粘贴c程序到ubuntu的c代码&#xff0c;发现多了 <200b>&#xff1a; 方案&#xff1a;尝试在vim编辑器删除&#xff0c;多出来的字符后编译…

如何实现前端缓存管理?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【MTK】【WIFI】手机和综测仪器误差在5db左右误差

在测试的时候发现CMU设置的信号强度和工程模式差异过大 原因分析是因为5G Rx Feloss没有填写导致 如下设置5G WF0 Tx/Rx Feloss; 指的是chipout 到测试座处的loss; 5*0.52.5dB 这样测下来误差就会在3db之内了&#xff0c;达到测试标准了

B 开组会(可持久线段树+树剖) 武汉大学2023年新生程序设计竞赛(同步赛)

其实题目就是每次询问一个节点 在这个节点的基础上往下继续遍历t的深度&#xff0c;在这个遍历的过程中找一个最大值就行了 其实这个题目数据非常水&#xff0c;直接暴力就可以过了 下面是别人过的代码 #include<bits/stdc.h> using namespace std; const int mxn5e…

C# 超好用的自定义异形窗体

1 功能介绍 项目上要用到圆形的按钮打开界面,类似于什么加速球,内存清理球,点击圆形按钮打开界面等等功能,通过这个例子就可以简单实现,图片是什么样的,他就是什么窗体,无锯齿,很好用,工程文件代码放在末尾2 效果图片 3 代码测试 1 创建.netframework winform项目,引…

分库分表Springboot-Starter源码解析

在网上看到一个开源的分库分表组件&#xff0c;并且通过SPI机制做成了springboot的starter&#xff0c;觉得挺有意思的&#xff0c;给大家介绍一下。** 首先有两个mapper对象&#xff0c;一个是普通的mapper&#xff0c;一个是分库分表的mapper&#xff0c;分别往数据库插入数据…

MES系统安灯管理:实时可视化生产线状态

一、MES系统安灯管理的意义&#xff1a; 安灯管理是指通过使用不同颜色的灯光信号来表示生产线的状态&#xff0c;以便生产人员能够直观地了解生产线的运行情况。MES系统安灯管理的意义在于提供一个实时可视化的工具&#xff0c;使制造企业能够及时发现生产线异常和潜在问题&a…

用TRIZ创新方法理论指导产品研发学习笔记

事物的矛盾法则 事物的矛盾法则&#xff0c;也称为辩证法的矛盾法则&#xff0c;是马克思主义哲学中的一个基本概念&#xff0c;用于描述事物内部矛盾的本质和发展规律。这个法则强调&#xff0c;事物内部存在着矛盾&#xff0c;而矛盾是事物发展的动力和源泉。 TRIZ理论解决…

代码随想录算法训练营第五十六天 |1143.最长公共子序列、1035.不相交的线、53. 最大子序和动态规划

一、1143.最长公共子序列 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;动态规划子序列问题经典题目 | LeetCode&#xff1a;1143.最长公共子序列_哔哩哔哩_bilibili 思考&#xff1a; 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]…

Jenkins对应java版本

官网地址&#xff1a;Java Support Policy 运行jenkins时,需要使用下列Java版本:

UEFI基础——测试用例Hello Word

Hello 测试用例 硬件环境&#xff1a;龙芯ls3a6000平台 软件环境&#xff1a;龙芯uefi固件 GUID获取网址&#xff1a;https://guidgen.com 一、创建工程 mkdir TextPkg/三个文件 Hello.c 、 Hello.inf 、HelloPkg.dsc 1.1 Hello.c /** fileThe application to print hello …

【踩坑】hive脚本笛卡尔积严重降低查询效率问题

前一阵子查看我们公司的大数据平台的离线脚本运行情况, 结果发现有一个任务居然跑了一天多, 要知道这还只是几千万量级的表, 且这个任务是每天需要执行的 于是我把hive脚本捞出来看了下, 发现无非多join了几个复杂的子查询, 应该不至于这么久, 包括我又检查了是不是没有加上每…

TCP/IP(五)TCP的连接管理(二)

一 ISN序列号探究 本文主要探究三次握手建立TCP连接的细节备注&#xff1a; 某些问题探究的比较深入,当前用不到,暂时通过链接引入进来吃水不忘挖井人&#xff1a; 小林 coding ① 初始序列号 ISN 是如何随机产生的 ISN: 初始化序列号 Initial Sequence Number 接收方和…

0基础学习VR全景平台篇 第106篇:认识调色软件Lightroom

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 正式开讲之前需要先引出一个概念&#xff1a;到底什么是调色? 比如说上面这张照片&#xff0c;你可能会具体的指出照片中的元素有天空、山脉、草地等…… 如果我们跳出我们的固…

sqlserver2008安装时的性能计数器注册表配置单元一致性失败问题

安装出现此项检测失败时&#xff1b;根据资料&#xff0c; 进入注册表如下条目&#xff0c;Perflib下面有 Last Counter和Last Help&#xff0c;数值分别是10122和10123&#xff1b; 009键下面包括Counter和Help&#xff0c;打开Counter看一下&#xff0c;下面有一些数值&…

关键词搜索淘宝商品数据接口,淘宝商品列表数据接口

关键词搜索淘宝商品数据接口可以通过淘宝开放平台获取商品列表数据&#xff0c;包括商品标题、价格、优惠价、收藏数、月销售量、SKU图、详情页图片等。 通过调用淘宝开放平台的API接口&#xff0c;可以实现关键词搜索淘宝商品列表数据&#xff0c;获取商品详情页数据信息&…

CSS设置鼠标样式和添加视频样式

鼠标的样式 <div style"cursor: default">默认鼠标的样式</div><div style"cursor: pointer">小手样式</div><div style"cursor: move">移动样式</div><div style"cursor: text">文本样式&…

生命在于折腾——Stable Diffution(Mac端)

一、前言 最近一段时间研究了一下Stable Diffution&#xff0c;Windows和MAC端都搭建成功了&#xff0c;也尝试了各种功能&#xff0c;后续会学习新的使用姿势&#xff0c;写一篇文章记录一下。 二、介绍 1、Stable Diffution是什么 Stable Diffusion&#xff0c;是一种AI绘…