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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42521881/article/details/84966133
今日推荐