337. 打家劫舍 III

 

分析:状态转移分为节点选择和不选择两种情况,分别记录某个节点选择和不选择的可以得到的最大值

  选择节点node,则左右孩子节点都不可以选择 

  不选择节点node,则左右孩子节点都可以选择,需要比较大小看是否选择

代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode() {}
 8  *     TreeNode(int val) { this.val = val; }
 9  *     TreeNode(int val, TreeNode left, TreeNode right) {
10  *         this.val = val;
11  *         this.left = left;
12  *         this.right = right;
13  *     }
14  * }
15  */
16 class Solution {
17     Map<TreeNode,Integer> f = new HashMap<>(); // TreeNode 当前节点选中 Integer 最大的价值
18     Map<TreeNode,Integer> g = new HashMap<>(); // TreeNode 当前节点不选 Integer 最大的价值
19     public int rob(TreeNode root) {
20         // 深度优先遍历
21         dfs(root);
22         return Math.max(f.getOrDefault(root,0),g.getOrDefault(root,0));
23     }
24     public void dfs(TreeNode node){
25         if(node == null){
26             return;
27         }
28         dfs(node.left);
29         dfs(node.right);
30         // 当前节点选择 f(node) = g(node.left) + g(node.right)
31         f.put(node,node.val + g.getOrDefault(node.left,0) + g.getOrDefault(node.right,0));
32         // 当前节点不选择 g(node) = max(f(node.left),g(node.left)) + max(f(node.right),g(node.right));
33         g.put(node,Math.max(f.getOrDefault(node.left,0),g.getOrDefault(node.left,0)) 
34         + Math.max(f.getOrDefault(node.right,0),g.getOrDefault(node.right,0)));
35     }
36 
37 }

 

 关键使用hash表作为散列函数存储状态值

 

posted @ 2022-07-16 17:11  yky_xukai的胡思乱想  阅读(31)  评论(0)    收藏  举报