资源预览内容
第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
亲,该文档总共3页全部预览完了,如果喜欢就下载吧!
资源描述
Java实现 LeetCode 337 打家劫舍 III(三)337. 打家劫舍 III在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: 3,2,3,null,3,null,1 3 / 2 3 3 1输出: 7解释: 小偷一晚能够盗取的最高金额 = 3 + 3 + 1 = 7.示例 2:输入: 3,4,5,1,3,null,1 3 / 4 5 / 1 3 1输出: 9解释: 小偷一晚能够盗取的最高金额 = 4 + 5 = 9. /递归思想(不要深入递归函数体,只需知道递归函数的功能,以及找到跳出递归的边界条件) /思路: /能盗取的最高金额为 抢劫该节点+抢劫该节点的左孩子的左右子树+抢劫该节点的右孩子的左右子树 /与 抢劫该节点的左子树+抢劫该节点的右子树的和 的最大值 /执行用时 1005ms 原因是出现了很多重复的计算,可使用动态规划解决 if(root = null) return 0; int val = 0; if(root.left != null) val += rob(root.left.left) + rob(root.left.right); if(root.right != null) val += rob(root.right.left) + rob(root.right.right); return Math.max(rob(root.left) + rob(root.right),val + root.val); */ /* * Definition for a binary tree node. * public class TreeNode * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) val = x; * */class Solution public int rob(TreeNode root) /动态规划 /思路: /定义一个数组res,长度为2,res0表示不抢该节点可获得最大值,res1表示抢劫该节点可获得最大值 /方法helper(r)意为:在以r为根节点的树中,返回抢劫根节点与不抢劫根节点可获得的最大值 /执行用时 2ms int res = helper(root); return Math.max(res0,res1); public int helper(TreeNode r) /边界条件,r为null时,跳出 if(r = null) return new int2; /对于以r.left为根的树,计算抢劫根节点(r.left)与不抢劫根节点可获得最大金额. /left0则为不抢r.lrft可获得的最大金额,left1则为抢劫r.left可获得的最大金额 以下right 分析同理 int left = helper(r.left); int right = helper(r.right); int res = new int2; /计算不抢劫当前根节点可获得的最大金额(那么其左右子树可以随便抢) res0 = Math.max(left0,left1) + Math.max(right0,right1); /计算若抢劫根节点可获得的最大金额(此时,其左右子树的根节点不能被抢) res1 = r.val + left0 + right0; return res;
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号