Middle-题目129:337. House Robber III(增补1)

转载 2016年05月31日 20:23:55

题目原文:
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.
题目大意:
此题是Easy-题目26Middle-题目58的变形,这次这个贼偷的是二叉树,每偷一个节点,它的父节点和子节点都不能偷了,求最大收益。
题目分析:
我们很熟悉的前两题都是使用动态规划,而这道题用的是深搜,深搜的返回结果是一个两个元素的数组profit,其中profit[0]代表偷当前节点的时候得到的最大收益,profit[1]代表不偷当前节点时获得的最大收益。那么每次搜索左右子树的最大收益记为leftprofit和rightprofit,并取:
profit[0]=leftProfit[1]+rightProfit[1]+root.val;
profit[1]=Math.max(leftProfit[0],leftProfit[1])+Math.max(rightProfit[0],rightProfit[1]);
直到遇到空节点返回new int[2].
源码:(language:java)

public class Solution {
    public int rob(TreeNode root) {
        int[] profit = dfs(root);
        return Math.max(profit[0], profit[1]);
    }
    private int[] dfs(TreeNode root) {
        int[] profit = new int[2];
        // profit[0] stands for the maximum profit with robbing root, while profit[1] stands for the maximum profit without robbing root.
        if(root!=null) {
            int[] leftProfit = dfs(root.left);
            int[] rightProfit = dfs(root.right);
            profit[0] = leftProfit[1] + rightProfit[1] + root.val;
            profit[1] = Math.max(leftProfit[0],leftProfit[1]) + Math.max(rightProfit[0], rightProfit[1]);
            return profit;
        }
        return new int[2];
    }
}

成绩:
1ms(统计信息还未显示)
Cmershen的碎碎念:
本题的递归之前的题较少接触,递归的关系不太容易看出来,其实递归的设计应该是考虑函数的入口参数和返回值以及函数的功能,而不是强调递推关系式(类似斐波那契数列的递归方法或者欧几里得算法求gcd),那样构思很多时候是想不出来的(比如本题)。

[leetcode-337]House Robber III(java)

原题:House RobberIII对于这种树形结构,应该很容易想到使用递归的方法,这里的难点在于递归的时候相邻点不能同时访问,因此我写成了第一种做法,也ac了,但是这样并不好,因为它对很多点都会重复...
  • zdavb
  • zdavb
  • 2016年03月27日 22:19
  • 832

leetcode 337. House Robber III-动态规划|Java|Python简洁高效

原题链接:337. House Robber III 【思路】 和 House Robber 十分类似,是Dynamic Programming问题。这里使用递归来实现,数组rob来存储。rob[0...
  • happyaaaaaaaaaaa
  • happyaaaaaaaaaaa
  • 2016年03月13日 21:06
  • 4656

[leetcode] 337. House Robber III

The thief has found himself a new place for his thievery again. There is only one entrance to this a...
  • TstsUgeg
  • TstsUgeg
  • 2016年03月12日 20:20
  • 2337

LeetCode337. House Robber III

题目: https://leetcode.com/problems/house-robber-iii/ The thief has found himself a new place for hi...
  • codeTZ
  • codeTZ
  • 2016年03月23日 20:34
  • 1103

337. House Robber III (C++实现)

解题思路: 递归求解,若为空树返回0; 若只有一个根结点就返回根结点的值; 否则,若根结点有孩子,两种抢法:抢根结点!不抢根结点,抢根结点的孩子子树!取最大值(选抢的多的方案)! (注:抢根结点,就不...
  • jingmiaa
  • jingmiaa
  • 2016年05月09日 18:41
  • 432

LeetCode213——House Robber II

Note: This is an extension of House Robber. After robbing those houses on that street, the thief ...
  • booirror
  • booirror
  • 2015年08月03日 11:28
  • 1025

LeetCode 337. House Robber III(java)

The thief has found himself a new place for his thievery again. There is only one entrance to this a...
  • katrina95
  • katrina95
  • 2018年01月21日 05:21
  • 16

337. House Robber III**

The thief has found himself a new place for his thievery again. There is only one entrance to this a...
  • alwaystry
  • alwaystry
  • 2016年12月24日 15:40
  • 146

337. House Robber III

The thief has found himself a new place for his thievery again. There is only one entrance to this a...
  • mawu_1014
  • mawu_1014
  • 2016年03月27日 21:35
  • 143

LeetCode_198. House Robber_动态规划

198. House Robber You are a professional robber planning to rob houses along a street. Each house ...
  • Binbin_Sun
  • Binbin_Sun
  • 2016年01月21日 12:45
  • 444
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目129:337. House Robber III(增补1)
举报原因:
原因补充:

(最多只允许输入30个字)