leetcode 337. 打家劫舍 III

不能简单用层次遍历把隔行的加起来,因为考虑单链表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));
}
}

浙公网安备 33010602011771号