用照片做模板下载网站好外贸网站建设560
用照片做模板下载网站好,外贸网站建设560,网站建设包含哪些,手机排行榜文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目
标题和出处
标题#xff1a;分裂二叉树的最大乘积
出处#xff1a;1339. 分裂二叉树的最大乘积
难度
6 级
题目描述
要求
给定二叉树的根结点 root \texttt{root} root分裂二叉树的最大乘积
出处1339. 分裂二叉树的最大乘积
难度
6 级
题目描述
要求
给定二叉树的根结点 root \texttt{root} root删除一条边将二叉树分裂成两个子树使得两个子树和的乘积最大。
返回两个子树和的最大乘积。由于答案可能会很大将结果对 10 9 7 \texttt{10}^\texttt{9} \texttt{7} 1097 取模后返回。
注意应该在取模前将答案最大化不是取模后将答案最大化。
示例
示例 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 输入 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} 1≤Node.val≤104
解法
思路和算法
删除一条边将二叉树分裂成两个子树之后其中的一个子树为原二叉树的子树只要知道二叉树的结点值总和与该子树的结点值总和即可知道另一个子树的结点值总和并计算两个子树和的乘积。
计算二叉树的结点值总和可以使用深度优先搜索实现。二叉树的结点值总和为根结点与每个非空子树和的总和。
首先计算二叉树的结点值总和然后再次遍历二叉树计算每个子树的结点值总和。对于每个子树计算该子树的结点值总和与另一个子树的结点值总和的乘积。遍历结束之后即可得到最大乘积。
二叉树的所有结点值总和不会超出 32 32 32 位整数范围但是两个子树和的乘积可能超出 32 32 32 位整数范围。为了避免计算最大乘积时溢出有两种方案一是使用 64 64 64 位整数存储最大乘积二是利用数学性质维护最大乘积对应的两个子树和。此处使用第二种方案。
假设原二叉树的结点值总和为 x x x两个子树和分别为 x 2 y \dfrac{x}{2} y 2xy 和 x 2 − y \dfrac{x}{2} - y 2x−y其中 x 2 y 0 \dfrac{x}{2} y 0 2xy0两个子树和的乘积是 ( x 2 y ) ( x 2 − y ) \Big(\dfrac{x}{2} y\Big)\Big(\dfrac{x}{2} - y\Big) (2xy)(2x−y)。根据平方差公式有 ( 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 (2xy)(2x−y)4x2−y2。由于 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/pingmian/89456.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!