leetcode 337. 打家劫舍 III

image

不能简单用层次遍历把隔行的加起来,因为考虑单链表2->1->3->4,最大是2+4=6

f(node)表示占用node的最大值。g(node)表示不占用node的最大值。则:

f(node)=node.val+g(node.left)+g(node.right)
g(node)=max(f(node.left),g(node.left))+max(f(node.right),g(node.right))

采用记忆化搜索,用哈希表存储结果。

class Solution {
    Map<TreeNode,Integer> f=new HashMap<>();
    Map<TreeNode,Integer> g=new HashMap<>();

    public int rob(TreeNode root) {
        f.put(null,0);
        g.put(null,0);
        dfs(root);
        return Math.max(f.get(root),g.get(root));
    }

    void dfs(TreeNode root){
        if(root==null) return;
        dfs(root.left);
        dfs(root.right);
        int fl=f.get(root.left),fr=f.get(root.right);
        int gl=g.get(root.left),gr=g.get(root.right);
        f.put(root,root.val+gl+gr);
        g.put(root,Math.max(fl,gl)+Math.max(fr,gr));
    }
}
posted @ 2022-03-24 22:20  livingsu  阅读(26)  评论(0)    收藏  举报