二叉树题目:分裂二叉树的最大乘积

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:分裂二叉树的最大乘积

出处:1339. 分裂二叉树的最大乘积

难度

6 级

题目描述

要求

给定二叉树的根结点 root \texttt{root} root,删除一条边将二叉树分裂成两个子树,使得两个子树和的乘积最大。

返回两个子树和的最大乘积。由于答案可能会很大,将结果对 10 9 + 7 \texttt{10}^\texttt{9} + \texttt{7} 109+7 取模后返回。

注意应该在取模前将答案最大化,不是取模后将答案最大化。

示例

示例 1:

示例 1

输入: root = [1,2,3,4,5,6] \texttt{root = [1,2,3,4,5,6]} root = [1,2,3,4,5,6]
输出: 110 \texttt{110} 110
解释:删除红色的边,得到 2 \texttt{2} 2 个子树,和分别为 11 \texttt{11} 11 10 \texttt{10} 10。它们的乘积是 110 \texttt{110} 110 11 × 10 \texttt{11} \times \texttt{10} 11×10)。

示例 2:

示例 2

输入: root = [1,null,2,3,4,null,null,5,6] \texttt{root = [1,null,2,3,4,null,null,5,6]} root = [1,null,2,3,4,null,null,5,6]
输出: 90 \texttt{90} 90
解释:移除红色的边,得到 2 \texttt{2} 2 个子树,和分别是 15 \texttt{15} 15 6 \texttt{6} 6。它们的乘积为 90 \texttt{90} 90 15 × 6 \texttt{15} \times \texttt{6} 15×6)。

数据范围

  • 树中结点数目在范围 [2, 5 × 10 4 ] \texttt{[2, 5} \times \texttt{10}^\texttt{4}\texttt{]} [2, 5×104]
  • 1 ≤ Node.val ≤ 10 4 \texttt{1} \le \texttt{Node.val} \le \texttt{10}^\texttt{4} 1Node.val104

解法

思路和算法

删除一条边将二叉树分裂成两个子树之后,其中的一个子树为原二叉树的子树,只要知道二叉树的结点值总和与该子树的结点值总和,即可知道另一个子树的结点值总和并计算两个子树和的乘积。

计算二叉树的结点值总和可以使用深度优先搜索实现。二叉树的结点值总和为根结点与每个非空子树和的总和。

首先计算二叉树的结点值总和,然后再次遍历二叉树计算每个子树的结点值总和。对于每个子树,计算该子树的结点值总和与另一个子树的结点值总和的乘积。遍历结束之后即可得到最大乘积。

二叉树的所有结点值总和不会超出 32 32 32 位整数范围,但是两个子树和的乘积可能超出 32 32 32 位整数范围。为了避免计算最大乘积时溢出,有两种方案,一是使用 64 64 64 位整数存储最大乘积,二是利用数学性质维护最大乘积对应的两个子树和。此处使用第二种方案。

假设原二叉树的结点值总和为 x x x,两个子树和分别为 x 2 + y \dfrac{x}{2} + y 2x+y x 2 − y \dfrac{x}{2} - y 2xy,其中 x 2 > y > 0 \dfrac{x}{2} > y > 0 2x>y>0,两个子树和的乘积是 ( x 2 + y ) ( x 2 − y ) \Big(\dfrac{x}{2} + y\Big)\Big(\dfrac{x}{2} - y\Big) (2x+y)(2xy)。根据平方差公式,有 ( x 2 + y ) ( x 2 − y ) = x 2 4 − y 2 \Big(\dfrac{x}{2} + y\Big)\Big(\dfrac{x}{2} - y\Big) = \dfrac{x^2}{4} - y^2 (2x+y)(2xy)=4x2y2。由于 x x x 为原二叉树的结点值总和,因此 x x x 为定值,为了使两个子树的乘积最大, y y y 应尽量小,即两个子树和之差的绝对值应尽量小。当两个子树和之差的绝对值最小时,两个子树和的乘积最大。

利用数学性质,维护与二叉树的结点值总和的一半最接近的子树和,遍历结束之后即可得到两个子树和的最大乘积。

代码

class Solution {static final int MODULO = 1000000007;int sum = 0;int bestSplitSum = 0;public int maxProduct(TreeNode root) {sum = getSum(root);getSum(root);int product = (int) ((long) bestSplitSum * (sum - bestSplitSum) % MODULO);return product;}public int getSum(TreeNode node) {int curSum = node.val;TreeNode left = node.left, right = node.right;if (left != null) {curSum += getSum(node.left);}if (right != null) {curSum += getSum(node.right);}if (sum > 0 && Math.abs(curSum * 2 - sum) < Math.abs(bestSplitSum * 2 - sum)) {bestSplitSum = curSum;}return curSum;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。需要执行两次深度优先搜索,每次深度优先搜索的时间复杂度是 O ( n ) O(n) O(n)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

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

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

相关文章

STL 优先队列priority_queue练习

目录 STL之优先队列priority_queue 绝对值排序问题&#xff08;题目描述&#xff09; &#xff08;一&#xff09;使用优先队列prioroty_queue实现绝对值降序排序 &#xff08;二&#xff09;使用vector实现绝对值降序排序&#xff08;使用库中的全局sort()函数&#xff09;…

P5740最厉害的学生

一&#xff1a;题目 二&#xff1a;思路分析 这道题就是会使用C语言的结构体&#xff0c;然后知道结构体数组 三&#xff1a;代码 #include <stdio.h> struct Stu {char name[10];int c;int m;int e; }s[1005];//结构体数组 int main() {int n 0;scanf("%d"…

GEE:基于MCD64A1的GlobFire的火灾时间

作者:CSDN @ _养乐多_ 本文将介绍如何可视化 JRC/GWIS/GlobFire/v2/FinalPerimeters 数据集中每个火灾斑块,以及火灾斑块发生火灾的时间。因为原始数据的时间是年月日格式,可视化只能是将其转换成 Day Of Year (DOY,一年中的天数,0-366),这样才能了解火灾发生的具体时…

4.9【共享源】流的多生产者和消费者

当一个系统中存在多个生产者和消费者时&#xff0c;情况可能会变得复杂。 了解生产者和消费者流之间支持的基数非常重要。 本质上&#xff0c;一个生产者流可以与多个消费者流连接&#xff0c;但一个消费者流只能连接到一个生产者流。请注意&#xff0c;基数关系仅限于单个流&…

Fusion360 服务器验证警告 解决方案

提示信息 服务器验证警告 无法验证安全证书。代理服务器、安全软件或废弃的操作系统补丁常常会触发此错误消息。 如果要更改此设置&#xff0c;请访问“网络/服务器验证"首选项页面。 解决方案 方案1:关闭你的代理软件&#xff08;方便快捷&#xff09; 方案2:观察代理软…

视频号小店需要多少资金?

我是电商珠珠 视频号团队自22年发展视频号小店以来&#xff0c;为人所知。和抖音电商一样&#xff0c;都是在发展的第二年掀起了浪花。 也就是今年&#xff0c;很多想要入驻的新手&#xff0c;对于视频号小店不太了解&#xff0c;不清楚到底需要多少资金。 今天&#xff0c;…

欧洲:数百家电商网站泄露了用户支付信息

欧洲刑警组织在12月22日发布的新闻稿中&#xff0c;称由 17 个国家联合参与的执法行动已发现数百个电商平台存在恶意脚本攻击&#xff0c;其用户的信用卡或支付卡数据已遭到泄露。 这项已进行两个月的执法行动由希腊牵头&#xff0c;欧洲刑警组织参与协调&#xff0c;并得到网络…

卷积神经网络基础与补充

参考自 up主的b站链接&#xff1a;霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 https://blog.csdn.net/m0_37867091?typeblog CNN的历史发展&#xff1a; 这一点老师上课的时候也有讲到&#xff0c;BP的出现对CNN的发展至关重要 卷积的特性&#x…

第十五节TypeScript 接口

1、简介 接口是一系列抽象方法的声明&#xff0c;是一些方法特征的集合&#xff0c;这些方法都应该是抽象的&#xff0c;需要有由具体的类去实现&#xff0c;然后第三方就可以通过这组抽象方法调用&#xff0c;让具体的类执行具体的方法。 2、接口的定义 interface interface_…

浮点数的转换--IEEE 754

IEEE754标准是一种浮点数表示标准&#xff0c;一般分为 单精度&#xff08;32位的二进制数&#xff09;&#xff1b;双精度&#xff08;64位的二进制数&#xff09; 根据国际标准IEEE754&#xff0c;任意一个二进制浮点数V可以表示为下面形式&#xff1a; V (-1)^s *&#…

民富购:塑造数字时代下的电商革新与社会责任典范

在数字经济时代,电子商务已经成为建立市场关系、创新产业和服务业态、促进经济增长的重要途径和手段。特别是在中国,新型电子商务的迅猛发展已经改变了生产和生活的方方面面,不仅催生了众多新业态,还通过“互联网”战略让许多传统产业和服务焕发了新的生机。民富购,作为扬羊(广…

SQL进阶理论篇(二十一):基于SQLMap的自动化SQL注入

文章目录 简介获取当前数据库和用户信息获取MySQL中的所有数据库名称查询wucai数据库中的所有数据表查看heros数据表中的所有字段查询heros表中的英雄信息总结参考文献 简介 从上一小节&#xff0c;可以发现&#xff0c;如果我们编写的代码存在着SQL注入的漏洞&#xff0c;后果…

FME软件安装教程及问题解决

FME软件 FME(Feature Manipulate Engine,简称FME)是加拿大Safe Software公司开发的空间数据转换处理系统,它是完整的空间ETL解决方案。该方案基于OpenGIS组织提出的新的数据转换理念“语义转换”,通过提供在转换过程中重构数据的功能,实现了超过250种不同空间数据格式(模型)之…

Scikit-Learn线性回归(一)

Scikit-Learn线性回归一 1、线性回归概述1.1、什么是回归1.2、什么是线性1.3、什么是线性回归1.4、线性回归的优缺点1.5、线性回归与逻辑回归2、线性回归的原理2.1、线性回归的定义与原理2.2、线性回归的损失函数3、Scikit-Learn线性回归3.1、Scikit-Learn线性回归API3.2、Scik…

华清远见嵌入式学习——ARM——作业3

作业要求&#xff1a; 代码效果图&#xff1a; 代码&#xff1a; led.h #ifndef __LED_H__ #define __LED_H__#define RCC_GPIO (*(unsigned int *)0x50000a28) #define GPIOE_MODER (*(unsigned int *)0x50006000) #define GPIOF_MODER (*(unsigned int *)0x50007000) #defi…

使用 Amazon CodeCatalyst 中的生成式 AI 助手 Amazon Q 提高开发人员的工作效率(预览版)

今天&#xff0c;我很荣幸能够向各位介绍 Amazon CodeCatalyst 中可用的新型生成式 AI 助手 Amazon Q&#xff0c; 主要用于加速软件分发。 加速软件功能开发 – Amazon Q 的这项功能开发技术可以帮助您快速地完成软件开发任务&#xff0c;例如添加注释和 README、优化问题描述…

TensorFlow 模型中的回调函数与损失函数

回调函数 tf.keras 的回调函数实际上是一个类&#xff0c;一般是在 model.fit 时作为参数指定&#xff0c;用于控制在训练过程开始或者在训练过程结束&#xff0c;在每个 epoch 训练开始或者训练结束&#xff0c;在每个 batch 训练开始或者训练结束时执行一些操作&#xff0c;…

GIT 不同仓库之间合并代码

合并两个不同仓库的代码通常需要以下步骤。这里以合并两个远程仓库为例&#xff1a; 添加远程仓库&#xff1a; 在本地仓库中&#xff0c;使用以下命令添加第二个远程仓库&#xff1a; git remote add <远程仓库名> <远程仓库URL>例如&#xff1a; git remote add …

国内厉害的游戏开发公司有哪些?

中懿游游戏软件开发,中国有许多厉害的游戏开发公司&#xff0c;其中一些在国际上也享有盛誉。以下是一些在中国游戏开发领域中备受关注的公司&#xff1a; 腾讯游戏&#xff08;Tencent Games&#xff09;&#xff1a; 作为中国最大的互联网公司之一&#xff0c;腾讯的游戏分支…

视觉学习(6) —— 接收事件规则列表

条件&#xff1a; 两个地址 绑定地址1&#xff0c;条件是值为1才执行流程 &#xff08;1&#xff09;字节起止位置为 0-0 向100写入值1&#xff0c;流程次数是否会增加 答案是不会&#xff0c;字节0是在哪里 所以当写入值1 而因为字节起止位置是0 0 &#xff0c;所以只读字…