diff --git a/scala-leetcode/README.md b/scala-leetcode/README.md index 64b43269f3cf0791cc6e197e6cadb15c76f5f909..8fb434902a86ef0a3aa2fd60b9e02eeac0bbbb5f 100644 --- a/scala-leetcode/README.md +++ b/scala-leetcode/README.md @@ -64,6 +64,7 @@ Leetcode Scala 实现 * [先序遍历构造二叉树](./src/main/scala/io/github/dreamylost/Leetcode_1008.scala) * [填充每个节点的下一个右侧节点指针](./src/main/scala/io/github/dreamylost/Leetcode_116.scala) * [填充每个节点的下一个右侧节点指针 II](./src/main/scala/io/github/dreamylost/Leetcode_117.scala) +* [分裂二叉树的最大乘积](./src/main/scala/io/github/dreamylost/Leetcode_1339.scala) ## 链表 diff --git a/scala-leetcode/src/main/scala/io/github/dreamylost/Leetcode_1339.scala b/scala-leetcode/src/main/scala/io/github/dreamylost/Leetcode_1339.scala new file mode 100644 index 0000000000000000000000000000000000000000..0cfdb44b602aa8394afa17670d9e1788d9475760 --- /dev/null +++ b/scala-leetcode/src/main/scala/io/github/dreamylost/Leetcode_1339.scala @@ -0,0 +1,56 @@ +/* Licensed under Apache-2.0 @梦境迷离 */ +package io.github.dreamylost + +/** + * 1339. 分裂二叉树的最大乘积 + * + * 给你一棵二叉树,它的根为 root 。请你删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大。 + * + * 由于答案可能会很大,请你将结果对 [[10^9 + 7]] 取模后再返回 + * + * @see https://github.com/jxnu-liguobin + * @author 梦境迷离 dreamylost + * @version 1.0,2020/7/14 + */ +object Leetcode_1339 extends App { + + val ret = maxProduct(TreeNodeData.treeData6_1()) + println(ret) + + /** + * 2592 ms,100.00% + * 71.5 MB,100.00% + * + * @param root + * @return + */ + def maxProduct(root: TreeNode): Int = { + //设,以节点N与上层的边为待删除的边,乘积 = f(N上) * f(N下),分别为N上,与N下,其中N下的子树是以N为root节点的,另外一半子树比较麻烦,可以使用 sum - f(N下) + //即f(N上) = sum - f(N下) + //所以子树乘积 = sum - f(N下) × f(N下) + //其中,f(N下)比较好算,就是以当前节点为root节点的子树和,而sum更好算,就是整个树的和 + //ret = max(ret, sum - f(N下) * f(N下)) + + if (root == null) return 0 + var ret = Long.MinValue + + def sum(r: TreeNode): Int = { + if (r == null) return 0 + r.value + sum(r.left) + sum(r.right) + } + + val allNodeSum = sum(root) + + //必须Long + def dfs(r: TreeNode): Long = { + if (r == null) return 0 + val cNodeSum = dfs(r.left) + dfs(r.right) + r.value + ret = math.max(ret, (allNodeSum - cNodeSum) * cNodeSum) + cNodeSum + } + + dfs(root) + + (ret % (1e9 + 7)).toInt + } +} diff --git a/scala-leetcode/src/main/scala/io/github/dreamylost/TreeNodeData.scala b/scala-leetcode/src/main/scala/io/github/dreamylost/TreeNodeData.scala index 959082c444f4becb78ff8a6b8cf3e085286a5cb8..c7cddcd0e070679be1cd88a9027b390ae0447e3b 100644 --- a/scala-leetcode/src/main/scala/io/github/dreamylost/TreeNodeData.scala +++ b/scala-leetcode/src/main/scala/io/github/dreamylost/TreeNodeData.scala @@ -94,6 +94,25 @@ object TreeNodeData { n1 } + def treeData6_1(): TreeNode = { + val n1 = new TreeNode(1) + val n2 = new TreeNode(2) + val n3 = new TreeNode(3) + val n4 = new TreeNode(4) + val n5 = new TreeNode(5) + val n6 = new TreeNode(6) + + n1.left = n2 + n1.right = n3 + + n2.left = n4 + n2.right = n5 + + n3.left = n6 + + n1 + } + def treeData11(): TreeNode = { val treeNode5 = new TreeNode(5) val treeNode4 = new TreeNode(4)