From 4054d189d52a4e383b836088d9726c6547443945 Mon Sep 17 00:00:00 2001 From: Shawn <36914076+8kEatRadish@users.noreply.github.com> Date: Fri, 2 Apr 2021 12:19:08 +0800 Subject: [PATCH] feat:add LeetCode337 java solution code. --- .../0300-0399/0337.House Robber III/README.md | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/solution/0300-0399/0337.House Robber III/README.md b/solution/0300-0399/0337.House Robber III/README.md index b6410dbdaacfd..40f5fe5a8bab2 100644 --- a/solution/0300-0399/0337.House Robber III/README.md +++ b/solution/0300-0399/0337.House Robber III/README.md @@ -55,6 +55,33 @@ ```java +class Solution { + //这里f(o)表示选择o节点的最大权重和 + //这里g(o)表示不选择o节点最大权重和 + + //f(o) = g(o.left) + g(o.right) 因为选择了o节点,他的两个子节点就不可以选择 + //g(0) = Math.max(f(o.left),g(o.left)) + Math.max(f(o.right),g(o.right)) 不选择o节点,他的子节点可选择,也可不选择 + Map f = new HashMap<>(); + Map g = new HashMap<>(); + + public int rob(TreeNode root) { + dfs(root); + return Math.max(f.getOrDefault(root, 0), g.getOrDefault(root, 0)); + } + + private void dfs(TreeNode root) { + if (root == null) { + return; + } + + dfs(root.left); + dfs(root.right); + + //选择了root,所以求和的时候要把root.val算进去 + f.put(root, root.val + g.getOrDefault(root.left, 0) + g.getOrDefault(root.right, 0)); + g.put(root, Math.max(f.getOrDefault(root.left, 0), g.getOrDefault(root.left, 0)) + Math.max(f.getOrDefault(root.right, 0), g.getOrDefault(root.right, 0))); + } +} ```