7月算法训练------第十八天(树)解题报告
题目类型:树
题目难度:简单
第一题、1339. 分裂二叉树的最大乘积
- 题目链接:1339. 分裂二叉树的最大乘积
- 思路分析:
先遍历整棵树,得到整棵树上的数值之和sum
,然后我们再遍历它的子树,得到子树和cur,找到cur*(sum-cur)
的最大值。
这里需要一个数学知识:均值不等式,当cur越靠近sum/2
时,两数的乘积就越大,所以我们只需要将abs(sum/2)-cur
的值达到最小就能得到答案。转换一下:abs(sum - cur*2)
最小,这使得cur值就符合要求。 - 代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private long sum = 0;
private long cur = 0;
// private static final int MOD = (int) 1e9 + 7;
long MOD = 1000000007;
public int maxProduct(TreeNode root) {
dfs(root);
dfsMid(root);
return (int)(((sum - cur) * cur) % MOD);
}
private void dfs(TreeNode root){
if(root == null) {
return;
}
sum += root.val;
dfs(root.left);
dfs(root.right);
}
private long dfsMid(TreeNode root){
if(root == null){
return 0;
}
long temp = dfsMid(root.left) + dfsMid(root.right) + root.val;
if(Math.abs(sum - temp * 2) < Math.abs(sum - cur * 2)){
cur = temp;
}
return temp;
}
}