力扣-337-打家劫舍II
作者:互联网
动态规划思想,对于当前节点,只有取或不取两种情况,所以有:
- f(node)表示取当前节点的值的前提下,能够获取的最大值,g(root)表示不取当前节点的值的情况下,能够获取的最大值。
- 被选中时 f(node) = g(left) + g(right) + node.val
- 未被选中时 g(node) = max(f(left), g(left)) + max(f(right), g(right))
- 最终结果是 result = max(f(root), g(root))
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { Map<TreeNode, Integer> f = new HashMap<>(); Map<TreeNode, Integer> g = new HashMap<>(); public int rob(TreeNode root) { dfs(root); return Math.max(f.getOrDefault(root, 0), g.getOrDefault(root, 0)); } public void dfs(TreeNode root) { if(root == null) return ; //后序遍历 dfs(root.left); dfs(root.right); //被选中时 f(node) = g(left) + g(right) + node.val //未被选中时 g(node) = max(f(left), g(left)) + max(f(right), g(right)) //最终结果是 result = max(f(root), g(root)) 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))); } }
这里给出已知Key求Value的两种做法:
-
Map.getOrDefault(Object key, V defaultValue):jdk8中引入, 允许调用者在代码语句中规定获得在 map 中符合提供的键的值,否则在没有找到提供的键的匹配项的时候返回一个 “默认值”。
default V getOrDefault(Object key, V defaultValue) { V v; return (((v = get(key)) != null) || containsKey(key))? v: defaultValue; }
- 1).key:必需,想要获取的元素的键。
- 相比之下第一种方法更“安全”了。
标签:node,II,right,max,337,力扣,getOrDefault,root,left 来源: https://www.cnblogs.com/xiazhenbin/p/13784254.html