337. House Robber II
阿新 • • 發佈:2018-12-19
小偷又發現了自己盜竊的新地方。 這個區域只有一個入口,稱為“根”。 除了根之外,每個房子都有一個且只有一個父母的房子。 巡邏後,聰明的小偷意識到“這個地方的所有房屋都形成了一棵二叉樹”。 如果兩個直接連線的房屋在同一天晚上被闖入,它將自動聯絡警方。
確定小偷今晚可以搶劫的最大金額,而不會提醒警方。
** 題目連線**
正確答案
採用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);
}
}