337. House Robber II

小偷又发现了自己盗窃的新地方。 这个区域只有一个入口,称为“根”。 除了根之外,每个房子都有一个且只有一个父母的房子。 巡逻后,聪明的小偷意识到“这个地方的所有房屋都形成了一棵二叉树”。 如果两个直接连接的房屋在同一天晚上被闯入,它将自动联系警方。

确定小偷今晚可以抢劫的最大金额,而不会提醒警方。
** 题目连接**

正确答案

采用dfs

class Solution {
    public int rob(TreeNode root) {
      	int[] res = robSub(root);
	    return Math.max(res[0], res[1]);   
    }
    //返回一个含有两个元素的数组,第一个是不包含root时所得到的最优值,第二个是包含root时所得到的最优解
    private 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;
    }
}

错误答案

题目理解错误,不是隔一层就可以了,正确答案可能可以隔很多层,采用了按层遍历思想

class Solution {
    public int rob(TreeNode root) {
        if(root == null) return 0;
        List<TreeNode> list = new LinkedList<TreeNode>();
        list.add(root);
        int ans1=0,ans2=0;
        int start = 0;
        int end = 0;
        int new_end = end;
        while(start <= end)
        {
            while(start <= end)
            {
                ans1 += list.get(start).val;
                 
                if(list.get(start).left!=null)
                {
                    list.add(list.get(start).left);new_end++;
                }
                if(list.get(start).right!=null)
                {   
                    list.add(list.get(start).right);new_end++;
                }
                start++;
            }
            
            end = new_end;
            int ans = ans1;
            ans1 = ans2;
            ans2 = ans;
        }
        return Math.max(ans1,ans2);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值