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 @   yky_xukai的胡思乱想  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示