打劫房屋 III
2016-04-30 14:21
169 查看
在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树。与前两次偷窃相似的是每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且当相邻的两个房子同一天被打劫时,该系统会自动报警。
算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情况下。
样例
窃贼最多能偷窃的金钱数是 3 + 3 + 1 = 7.
窃贼最多能偷窃的金钱数是 4 + 5 = 9.
解题思路:递归。
对当前节点为根节点的树进行讨论,有打劫和不打劫当前节点两种可能。如果打劫,则不能打劫其子节点;否则可以打劫其子节点。则其能获得的最大金钱为打劫和不打劫当前节点两种可能中的最大值。
如果仅是单纯的递归,则会有大量重复计算,导致超时。所以我使用Map保存已经计算的结果来避免重复计算
代码:
算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情况下。
样例
3 / \ 2 3 \ \ 3 1
窃贼最多能偷窃的金钱数是 3 + 3 + 1 = 7.
3 / \ 4 5 / \ \ 1 3 1
窃贼最多能偷窃的金钱数是 4 + 5 = 9.
解题思路:递归。
对当前节点为根节点的树进行讨论,有打劫和不打劫当前节点两种可能。如果打劫,则不能打劫其子节点;否则可以打劫其子节点。则其能获得的最大金钱为打劫和不打劫当前节点两种可能中的最大值。
如果仅是单纯的递归,则会有大量重复计算,导致超时。所以我使用Map保存已经计算的结果来避免重复计算
代码:
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int x) { val = x; } * } */ public class Solution { /** * @param root: The root of binary tree. * @return: The maximum amount of money you can rob tonight */ Map<TreeNode, Integer> M = new HashMap<TreeNode, Integer>(); public int houseRobber3(TreeNode root) { // write your code here if(root==null) return 0; if(M.containsKey(root)) return M.get(root); /*加了这段就有错。。。莫非这中间还能有负数。。。不懂 if(root.left==null&&root.right==null) return root.val; */ //rob int rob = root.val; if(root.left!=null){ rob += houseRobber3(root.left.left); rob += houseRobber3(root.left.right); } if(root.right!=null){ rob += houseRobber3(root.right.left); rob += houseRobber3(root.right.right); } int noRob = houseRobber3(root.left) + houseRobber3(root.right); M.put(root, Math.max(rob, noRob)); return Math.max(rob, noRob); } }
相关文章推荐
- 1.Ubuntu Server下搭建LAMP环境
- 微信滑动底部菜单渐变效果
- 树上倍增实现lca
- 【leetcode】287. Find the Duplicate Number
- hdu2533:N皇后问题(dfs)
- POJ-1458 Common Subsequence ( DP )
- jquery 应用小结
- myeclipse 2014新建maven web 项目步骤
- Java IO系统——NIO之Buffer、Channel和Charset类
- Git初学
- 常用 redis 命令(for php)
- 蓝桥杯—网络寻路题解(邻接表构图)
- KVM&Libvirt基本概念及开发杂谈
- 网页中时光轴的简单实现
- sql2008登录成功后又更改了计算机名怎么办
- Java 类加载机制详解
- 简单的string 类库的封装
- XHTML总结
- 如何在Centos7上安装和使用ZFS
- myeclipse用maven搭建web项目后tomcat启动报找不到jar包解决办法