337. 打家劫舍 III


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/house-robber-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一开始的卡壳就是如何返回偷和不偷两种情况的结果。
// 最重要的一点是无论是dfs还是回溯,逻辑都是局部最优解。但是这种需要的是全局最优解。需要遍历所有情况。
public int rob(TreeNode root) {
int[] ret = dfs(root);
return Math.max(ret[0],ret[1]);
}
//[0]:偷的最大值;[1]:不偷的最大值
public int[] dfs(TreeNode node) {
if(node == null) {
return new int[2];
}
int[] left = dfs(node.left);
int[] right = dfs(node.right);
int[] ret = new int[2];
//该节点偷,那么它的孩子节点就不能偷
ret[0] = left[1] + right[1] + node.val;
ret[1] = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);
return ret;
}
浙公网安备 33010602011771号