zoukankan      html  css  js  c++  java
  • 337. House Robber III

    The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.

    Determine the maximum amount of money the thief can rob tonight without alerting the police.

    Example 1:

    Input: [3,2,3,null,3,null,1]
    
         3
        / 
       2   3
            
         3   1
    
    Output: 7 
    Explanation: Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.

    Example 2:

    Input: [3,4,5,1,3,null,1]
    
         3
        / 
       4   5
      /     
     1   3   1
    
    Output: 9
    Explanation: Maximum amount of money the thief can rob = 4 + 5 = 9.
    class Solution {
        public int rob(TreeNode root) {
            if (root == null) return 0;
            
            int leftLevel = 0;
            int leftSubLevel = 0;
            if (root.left != null) {
                leftLevel = rob(root.left);
                leftSubLevel = rob(root.left.left) + rob(root.left.right);
            } 
            
            int rightLevel = 0;
            int rightSubLevel = 0;
            if (root.right != null) {
                rightLevel = rob(root.right);
                rightSubLevel = rob(root.right.left) + rob(root.right.right);
            }
            
            return Math.max((root.val + leftSubLevel + rightSubLevel), leftLevel + rightLevel);
        }
    }

    巧,巧夺天工。dfs

     https://www.cnblogs.com/reboot329/p/6127932.html

    方法2:

    class Solution {
        public int rob(TreeNode root) {
            int[] res = robRecur(root);
            return Math.max(res[0], res[1]);
        }
        
        public int[] robRecur(TreeNode root) {
            if (root == null) {
                return new int[2];
            }
            
            int[] left = robRecur(root.left);
            int[] right = robRecur(root.right);
            int[] res = new int[2];
            // no rob root
            res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
            // rob root
            res[1] = root.val + left[0] + right[0];
            
            return res;
        }
    }
     res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);是因为不rob root的值是root的left + root的right,left又有robleft,不robleft。right也一样,所以也是求最大值相加。

     https://www.cnblogs.com/zebinlin/p/9809302.html

  • 相关阅读:
    pygame学习笔记(6)——一个超级简单的游戏
    pygame学习笔记(4)——声音
    pygame学习笔记(5)——精灵
    pygame学习笔记(2)——从画点到动画
    pygame学习笔记(3)——时间、事件、文字
    pygame学习笔记(1)——安装及矩形、圆型画图
    pygame入门
    Pygame
    aes python加密
    php aes加密
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/11690409.html
Copyright © 2011-2022 走看看