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;


    }
posted @ 2022-02-24 19:15  一颗青菜  阅读(4)  评论(0)    收藏  举报