【Leetcode 2673】使二叉树所有路径值相等的最小代价 —— 贪心法

news2024/11/25 22:38:41

2673. 使二叉树所有路径值相等的最小代价

给你一个整数n表示一棵 满二叉树 里面节点的数目,节点编号从1n。根节点编号为1,树中每个非叶子节点i都有两个孩子,分别是左孩子2 * i和右孩子2 * i + 1

树中每个节点都有一个值,用下标从0开始、长度为n的整数数组cost表示,其中 cost[i]是第i + 1个节点的值。每次操作,你可以将树中 **任意** 节点的值 增加 1` 。你可以执行操作 任意 次。

你的目标是让根到每一个 叶子结点 的路径值相等。请你返回 最少 需要执行增加操作多少次。

注意:

满二叉树 指的是一棵树,它满足树中除了叶子节点外每个节点都恰好有 2 个子节点,且所有叶子节点距离根节点距离相同。
路径值 指的是路径上所有节点的值之和。

示例 1:

输入:n = 7, cost = [1,5,2,2,3,3,1]
输出:6
解释:我们执行以下的增加操作:

  • 将节点 4 的值增加一次。
  • 将节点 3 的值增加三次。
  • 将节点 7 的值增加两次。
    从根到叶子的每一条路径值都为 9 。
    总共增加次数为 1 + 3 + 2 = 6 。
    这是最小的答案。

示例 2:

输入:n = 3, cost = [5,3,3]
输出:0
解释:两条路径已经有相等的路径值,所以不需要执行任何增加操作。

题目分析

贪心算法是一种基于贪心策略的算法设计方法,用于在求解最优化问题时作出一系列局部最优选择,从而达到全局最优的目标。贪心算法通常适用于满足最优子结构性质的问题,即问题的最优解可以通过一系列局部最优解的组合来得到

对于任一叶结点,它的值为 x,它的兄弟节点的值为 y,要想使得根到这两个叶节点的路径值相等,我们只能增加 x 和 y 本身。

由于我们希望操作次数最少,那么应该进行 ∣x−y∣ 次操作,将较小的值增加至与较大的值相等。

待考虑完所有叶节点之后,互为兄弟节点的叶节点的值两两相等(并且根到它们的路径值显然也相等)。如果我们还需要操作某个叶节点,那么为了使得路径值相等,它的兄弟节点同样也需要操作。此时就需要两次操作,但不如直接操作它们的双亲节点,可以省去一次操作。

因此,所有的叶节点都无需进行操作。我们就可以将它们全部移除。为了使得路径值保持不变,我们可以将叶节点的值增加至它们的双亲节点。这样一来,所有的双亲节点都变成了新的叶节点,我们重复进行上述操作即可。当只剩一个节点(根节点)时,就可以得到最终的答案。

由于本题中的树是以数组形式给定的,因此只需要对数组进行一次逆序遍历,就等价于对整个树进行了一次从叶节点开始的,自底向上的遍历

class Solution {
    public int minIncrements(int n, int[] cost) {
        int ans = 0;
        for (int i = n - 2; i > 0; i -= 2) {
            ans += Math.abs(cost[i] - cost[i + 1]);
            // 叶节点 i 和 i+1 的双亲节点下标为 i/2(整数除法)
            cost[i / 2] += Math.max(cost[i], cost[i + 1]);
        }
        return ans;
    }
}

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

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

相关文章

虚拟化之内存(Memory)

一 内存的查看方式 free -k/m/h cat /proc/meminfodmesg |grep memory free命令的实质是根据meminfo中的文件来提取信息 二 内存虚拟化 1.概念:由于物理MMU只能通过Host机的物理地址进行寻址,所以实现内存虚拟化,关键是需要将Guest机的…

Unity性能优化篇(二) 静态合批步骤与所有注意事项\游戏运行时使用代码启动静态合批

静态合批步骤: 1.开启Project Settings —>Player–>Other Setting里勾选Static Batching选项(一般情况下unity都是默认勾选状态) 2.勾选需要合批的静态物体上的Batching Static项,勾选后此物体下的所有子物体都默认参与静态合批(勾选后物体不能进行移动/旋转/缩放操作,…

C#,入门教程(06)——解决方案资源管理器,代码文件与文件夹的管理工具

上一篇: C#,入门教程(05)——Visual Studio 2022源程序(源代码)自动排版的功能动画图示https://blog.csdn.net/beijinghorn/article/details/124675293 大家平时都怎么管理源代码与文件夹呢?世界上最好的集成开发环境…

TinyEMU编译与使用(一)

TinyEMU编译与使用(一) 1 介绍2 准备工作3 编译TinyEMU3.1 安装依赖库3.2 编译 4 运行TinyEMU4.1 在线运行4.2 离线运行 5 共享目录5.1 修改root_9p-riscv64.cfg5.2 启动TinyEMU5.3 执行挂载命令 6 TinyEMU命令帮助 1 介绍 原名为riscvemu,于…

Oracle 的同义词(Synonym) 作用

Oracle 同义词(Synonym) 是数据库对象的一个别名,Oracle 可以为表、视图、序列、过程、函数、程序包等指定一个别名。同义词有两种类型: 私有同义词:拥有 CREATE SYNONYM 权限的用户(包括非管理员用户)即可创建私有同义词,创建的…

43. 【Linux教程】创建分区

前面小节介绍了文件系统,本小节介绍如何创建分区,创建分区之后就可以用来容纳文件系统。 1. 硬盘分区介绍 Linux 磁盘分区主要分为基本分区(primary partion)和扩充分区 (extension partion) 两种,基本分区和扩充分区…

Web-Check网站检查工具

Web-Check是一款网站检查工具,通过该工具,能够查看网站的各种关键数据,包括 DNS 记录、服务器位置、SSL 证书等方面的信息 开源地址 https://github.com/Lissy93/web-check 部署 docker run -d --name web-check -p 3000:3000 lissy93/web…

嵌入式系统是什么?Linux应用开发是开发什么的?

第一篇: 原文链接:https://www.zhihu.com/question/464205608/answer/3358027187 一、什么是嵌入式系统 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、可靠性、…

比较 2 名无人机驾驶员:借助分析飞得更高

近年来,越来越多的政府和执法机构使用无人机从空中鸟瞰。为了高效执行任务,无人机必须能够快速机动到预定目标。快速机动使它们能够在复杂的环境中航行,并高效地完成任务。成为认证的无人机驾驶员的要求因国家/地区而异,但都要求您…

Web组态可视化编辑器 快速绘制组态

随着工业智能制造的发展,工业企业对设备可视化、远程运维的需求日趋强烈,传统的单机版组态软件已经不能满足越来越复杂的控制需求,那么实现Web组态可视化界面成为了主要的技术路径。 行业痛点 对于软件服务商来说,将单机版软件转变…

易经智慧解码数字化转型:象数理视角下的未来探索

在数字化浪潮席卷全球的今天,我们不禁思考:国学《易经》的智慧如何与现代的数字化转型相结合,为我们提供独特的洞见和启示?今天我们从易经的象、数、理三个层面,浅析数字化转型的内在逻辑和发展趋势。 象:数…

Python打发无聊时光:14.用PyQt创建一个简易的串口调试助手

第一步:装pyqt5和pyserial库 pip install pyqt5 pyserial 第二步:完整代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QComboBox, \QGridLayout, QLineEdit, QTextEdit from P…

酷开科技以酷开系统为媒介,打造欢乐生活场景

家人相聚在一起的时光总是那么美好,在欢聚的日子里,我们也总是希望能够让时间变得慢一点,再慢一点,但是随着春节假期的结束,很多人已经开始了新一年的忙碌,大家纷纷回到工作、学习岗位,回归之前…

Java面试题【必知必会】Mybatis常见面试题(2024)

近期一直在准备面试,所以为了巩固知识,也为了梳理,整理了一些java的基础面试题!同时也希望各位英雄和女侠能够补充!不胜荣幸!!! 1.MyBatis是什么?他的优缺点?…

第八篇 - 预测受众(Predictive audience)技术是如何赋能数字化营销生态的?- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台,使命和功能 IAB成立于1996年,总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司,互动广告局(IAB- the Interactive Advertising Bureau)自1996年成立以来,先后为700多家媒…

快递通cps小程序源码

源码介绍: 快递代发快递代寄寄件小程序可以对接易达云洋一级总代快递小程序,接入云洋/易达物流接口,支持选择快递公司,三通一达,极兔,德邦等,功能成熟 如何收益: 1.对接第三方平台成本大约4元…

HTML表单标签,web前端开发新技术

1、ant-design的使用总结及常用组件和他们的基本用法? ant-design为React,Angular和Vue都提供了组件,同时为PC和移动端提供了常用的基础组件。ant-design提供的demo非常的丰富并且样式能够基本的覆盖开发需求。antd的Demo因为是多人编写的,…

从零学习Linux操作系统 第三十二部分 ansible中剧本的应用

一、什么是playbook及playbook的组成 1.Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 play就是一个个模块用列表的方式体现出来 playbook的语法是用YAML的预防进行书写的 2.YAML 简介 是一种表达资料序列的格式,类似XM…

Maven对项目构建过程中的每个步骤的详细介绍

1. 概述 Maven除了管理项目的依赖以外,还能对项目的构建过程进行管理。除了使用命令行以外,我们平时经常用IDEA图形化界面进行操作,如图所示: 本文将详细描述Maven对项目构建过程中的每一个阶段。 2. 构建过程 注意&#xff1…

183基于matlab的非线性调频模态分解(VNCMD)

基于matlab的非线性调频模态分解(VNCMD),一种基于变分方法的信号分解技术,它将信号分解为多个模式。能够处理非线性调频信号,且对噪声具有较好的鲁棒性。VNCMD的基本原理是通过最小化信号与模式之间的差异来实现信号的分解。程序已调通&#…