Skip to content

Latest commit

 

History

History
77 lines (54 loc) · 2.47 KB

0337-house-robber-iii.adoc

File metadata and controls

77 lines (54 loc) · 2.47 KB

337. 打家劫舍 III

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 树的节点数在 [1, 104] 范围内

  • 0 <= Node.val <= 104

思路分析

由于题目给出示例的误导,这里存在一个误区:在不选父节点时,子树选最优解不受任何干扰,也就是说子树的跟节点可选也可以不选。所以,可以将这个问题简化为,分选根节点和不选根节点,两种情况考虑:

  1. 选父节点,则子树必定不能选根节点;

  2. 如果不选跟节点,则子树可以在选根节点和不选跟节点中选最优解就好。

然后在这上面两种情况中选出最优解。

一刷
link:{sourcedir}/_0337_HouseRobberIII.java[role=include]
二刷
link:{sourcedir}/_0337_HouseRobberIii_2.java[role=include]

思考题

尝试使用动态规划来解决这个问题。已完成!