码迷,mamicode.com
首页 > 其他好文 > 详细

337. House Robber III

时间:2016-10-22 12:21:41      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:实现   算法   hashtable   each   roo   htable   into   ken   min   

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的极值。

337. House Robber III

标签:实现   算法   hashtable   each   roo   htable   into   ken   min   

原文地址:http://www.cnblogs.com/renyualbert/p/5987055.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!