337.打家劫舍 III
Posted HardyDragon_CC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了337.打家劫舍 III相关的知识,希望对你有一定的参考价值。
337.打家劫舍 III
思路
- 题目要求不能同时偷父结点和其孩子结点。要么偷父结点,要么偷其两个孩子结点。
- 这里可以使用一个长度为2的状态数组,记录当前节点偷与不偷所得到的的最大金钱。
- 关于树的的遍历这里使用后序遍历,左右根。最后返回的就是根节点的dp数组中的偷与不偷当前结点的金额的最大值。
class Solution {
public int rob(TreeNode root) {
int[] dp = robrec(root);
return Math.max(dp[0],dp[1]);
}
int[] robrec(TreeNode root){
int[] res = new int[2];
if(root == null) return res;
int[] left = robrec(root.left);
int[] right = robrec(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;
}
}
总结
- 关于树的一般思考到遍历方式,前中后、bfs/dfs…
- 递归函数先确定其函数的作用和返回值、终止条件。
以上是关于337.打家劫舍 III的主要内容,如果未能解决你的问题,请参考以下文章