写点什么

[Day18]-[动态规划] 打家劫舍 3

作者:方勇(gopher)
  • 2022 年 4 月 17 日
  • 本文字数:796 字

    阅读完需:约 3 分钟

337. 打家劫舍 III

难度中等 1250 收藏分享切换为英文接收动态反馈

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 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
复制代码


题解:

/** * Definition for a binary tree node. * type TreeNode struct { *     Val int *     Left *TreeNode *     Right *TreeNode * } */func rob(root *TreeNode) int {	var max func(x, y int) int       // 取最大值	var dfs func(*TreeNode)          // 递归函数	var rob func(root *TreeNode) int // 最大收益	var f = make(map[*TreeNode]int)  // 选择o节点的最大值	var g = make(map[*TreeNode]int)  // 不选择o节点的最大值
max = func(x, y int) int { if x > y { return x }
return y }
// 后序遍历 dfs = func(node *TreeNode) { // base case if node == nil { return }
dfs(node.Left) dfs(node.Right) // 做选择 // 选择o节点,那么就不能选择子节点 f选择,g不选择 f[node] = node.Val + g[node.Left] + g[node.Right] // 不选择o节点,那么子节点可选择或不选择,最两种选择的最大值 g[node] = max(f[node.Left], g[node.Left]) + max(f[node.Right], g[node.Right]) }
rob = func(root *TreeNode) int { dfs(root) return max(f[root], g[root]) }
return rob(root)}
复制代码


用户头像

Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入

我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!

评论

发布
暂无评论
[Day18]-[动态规划] 打家劫舍3_LeetCode_方勇(gopher)_InfoQ写作平台