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:

         3
        / 
       2   3
            
         3   1
    

    Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.

    Example 2:

         3
        / 
       4   5
      /     
     1   3   1
    

    Maximum amount of money the thief can rob = 4 + 5 = 9.

    这道题本质上是与之前的两道题一样的。 但是区别在于这道题是Btree。 首先最好想的是NoRob与Rob两个method,分别计算。具体code如下

     public int Rob(TreeNode root) {
            return Math.Max(Robb(root), NoRob(root));
        }
        
        public int Robb(TreeNode root)
        {
            if(root == null) return 0;
            var left = NoRob(root.left);
            var right = NoRob(root.right);
            return left+right+root.val;
        }
        
         public int NoRob(TreeNode root)
        {
            if(root == null) return 0;
            return Math.Max(Robb(root.left), NoRob(root.left))+Math.Max(Robb(root.right), NoRob(root.right));
        }

    这个submit的时候超时了。问题在于里面Robb与NoRob两个method实际上repeat了很多次。需要改进算法,一种解决方法是输出是array。第一个数存的是恰好rob这个Node的,第二数存的是没有Rob这个node的最大值。最后只要比较root输出的这连个值,取最大值就好了。

    具体代码为

    public int Rob(TreeNode root) {
            var res = Robb(root);
            return Math.Max(res[0],res[1]);
        }
        
        public int[] Robb(TreeNode root)
        {
            var res = new int[2];
            res[0] = 0;
            res[1] = 0;
            if(root == null) return res;
            var left = Robb(root.left);
            var right = Robb(root.right);
            res[0] = root.val+left[1]+right[1];
            res[1] = Math.Max(left[0],left[1]) + Math.Max(right[0],right[1]);
            return res;
        }

    此时想想能不能用第一种方法实现呢。理论上是可行的,即输入的时候加一个Hashtable,用来存每一个Node的极值。

  • 相关阅读:
    拷贝构造函数 转型构造函数
    构造函数对const成员的初始化
    拷贝构造函数
    类数据成员和类成员函数
    顶层函数进行操作符重载与操作符重载直接作为类的构造函数
    构造函数和new 与new【】 析构函数
    Openfire+XIFF实时通信&一个特殊的GP
    客户端数据动态渲染
    数据处理:由面得点,构造其边界
    从GISALL博客搬家而来
  • 原文地址:https://www.cnblogs.com/renyualbert/p/5987055.html
Copyright © 2011-2022 走看看