Leetcode | House Robber III

来源:互联网 发布:app软件制作教程 编辑:程序博客网 时间:2024/06/05 10:29

question

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.

normal solution

使用判断root节点与root.left.left、root.left.right
root.right.left、root.right.right之和 和 root.left、root.right之和 的大小

public int rob(TreeNode root) {    if(root==null) return 0;    int val=0;    if(root.left!=null)    {        val+=rob(root.left.left)+rob(root.left.right);    }    if(root.right!=null)    {        val+=rob(root.right.left)+rob(root.right.right);    }    return Math.max(val+root.val,rob(root.left)+rob(root.right));}

excellent solution

//用一个长度为2的数组保存选了这个节点和没选这个节点的最大值 分别对根节点的左右节点进行求得这数组 ,然后综合根节点的值进行判断

public int rob2(TreeNode root) {    int []res=robSub(root);    return Math.max(res[0],res[1]);}   public int [] robSub(TreeNode root){    if(root==null) return  new int[2];    int []left=robSub(root.left);    int []right=robSub(root.right);    int []res=new int[2];    res[0]=Math.max(left[0],left[1])+Math.max(right[0],right[1]);    res[1]=root.val+left[0]+right[0];    return res;}
0 0
原创粉丝点击