在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為「根」。 除了「根」之外,每棟房子有且只有乙個「父「房子與之相連。一番偵察之後,聰明的小偷意識到「這個地方的所有房屋的排列類似於一棵二叉樹」。 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。
計算在不觸動警報的情況下,小偷一晚能夠盜取的最高金額。
輸入: [3,2,3,null,3,null,1]3/ \
2 3\ \
3 1輸出: 7
解釋: 小偷一晚能夠盜取的最高金額 = 3 + 3 + 1 = 7.
輸入: [3,4,5,1,3,null,1]解法一:使用hashmap3/ \
4 5/ \ \
1 3 1
輸出: 9
解釋: 小偷一晚能夠盜取的最高金額 = 4 + 5 = 9.
f(o)表示在選中o節點的情況下,o節點的子樹上被選擇的節點的最大權值和
g(o)表示在未選中o節點的情況下,o節點的子樹上被選擇的節點的最大權值和
l和r表示o的左右子樹
當o被選中時,即f(o)=g(l)+g®+o.val
當o不被選中時,即g(o)=max+max
至此,我們可以用雜湊對映來存 f 和 g 的函式值,用深度優先搜尋的辦法後序遍歷這棵二叉樹,我們就可以得到每乙個節點的 f 和 g。根節點的 f 和 g 的最大值就是我們要找的答案。
class
solution
private
void
helper
(treenode root)
helper
(root.left)
;helper
(root.right)
;
f.put(root,g.
getordefault
(root.left,0)
+g.getordefault
(root.right,0)
+root.val)
; g.
put(root,math.
max(f.
getordefault
(root.left,0)
,g.getordefault
(root.left,0)
)+math.
max(f.
getordefault
(root.right,0)
,g.getordefault
(root.right,0)
));return;}
}
解法二:使用陣列代替hashmap。
省去hashmap占用的空間
class
solution
private
int[
]helper
(treenode root)
;int
l =
helper
(root.left)
;int
r =
helper
(root.right)
;int select = root.val + l[1]
+ r[1]
;int notselect = math.
max(l[0]
,l[1])
+math.
max(r[0]
,r[1])
;return
newint
;}}
198 打家劫舍
很明顯是dp問題。用乙個一維陣列表示dp陣列,狀態轉移方程為 resmax index max nums index resmax index 2 resmax index 1 其中resmax儲存,遍歷到該節點時的,最大值。注意,遍歷到該節點,但該節點不一定選。另外該題的初始解要想清楚。即resm...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
43 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...