楚雄彝族自治州网站建设_网站建设公司_定制开发_seo优化
2026/1/22 16:32:08 网站建设 项目流程

337.打家劫舍 III

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为root

除了root之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。

给定二叉树的root。返回在不触动警报的情况下,小偷能够盗取的最高金额

示例 1:

输入:root = [3,2,3,null,3,null,1]输出:7解释:小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

输入:root = [3,4,5,1,3,null,1]输出:9解释:小偷一晚能够盗取的最高金额 4 + 5 = 9

提示:

  • 树的节点数在[1, 104]范围内
  • 0 <= Node.val <= 104

该题是二叉树形状的打家劫舍的问题,可以用递归来返回选或不选的问题,每层的递归返回一个数组,res[2],其中res[0]表示不选当前节点的最大值,即要计算可选左右孩子节点的最大和,res[1]表示选当前节点,不选当前节点的左右节点的值。

public static void main(String[] args) { // 测试用 TreeNode root = new TreeNode(3); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.right = new TreeNode(3); root.right.right = new TreeNode(1); System.out.println(rob(root)); } public static int rob(TreeNode root) { int[] res = helper(root); return Math.max(res[0], res[1]); } public static int[] helper(TreeNode root){ int[] res = new int[2]; if (root == null){ return res; } int[] left = helper(root.left); int[] right = helper(root.right); res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); res[1] = root.val + left[0] + right[0]; return res; }

以上为记录分享用,代码较差请见谅

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询