作者:mobiledu2502879827 | 来源:互联网 | 2023-09-23 14:40
题目描述
- 这年头当个小偷,都得会 dp 和二叉树了
- 和前面的 I & II 有点不同,这次直接换了数据结构,写树来了。(之后不会是图吧)
- 很厉害,第一次接触到树型的dp,一听就特别不同凡响
思路 & 代码
- 返回值分成两部分,一个是当前 root 偷了的情况,一个是没偷的情况
- 状态转移方程、最优子结构、边界见代码
- 时间复杂度 O(n),空间复杂度 O(n)
class Solution {public int rob(TreeNode root) {int[] result = forRob(root);return Math.max(result[0], result[1]);}int[] forRob(TreeNode root){if(root == null){return new int[2];}int[] result = new int[2];int[] right = forRob(root.right);int[] left = forRob(root.left);result[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);result[1] = root.val + left[0] + right[0];return result;}
}
更新版
- 自底向上,状态转移方程是重点,思路可以看上面代码的注释。
class Solution {public int rob(TreeNode root) {int[] ans = robTree(root);return Math.max(ans[0], ans[1]);}public int[] robTree(TreeNode root) {if(root == null) {return new int[]{0, 0};}int[] left = robTree(root.left);int[] right = robTree(root.right);int[] now = new int[2];now[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);now[1] = root.val + left[0] + right[0];return now;}
}