1. 程式人生 > >337. House Robber II

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