力扣-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:必需,想要获取的元素的键。
  • 相比之下第一种方法更“安全”了。
上一篇:337. 打家劫舍 III


下一篇:jmeter压力测试netty-rpc-service