題目
在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為「根」。 除了「根」之外,每棟房子有且只有乙個「父「房子與之相連。一番偵察之後,聰明的小偷意識到「這個地方的所有房屋的排列類似於一棵二叉樹」。 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。
計算在不觸動警報的情況下,小偷一晚能夠盜取的最高金額。
示例 1:
輸入: [3,2,3,null,3,null,1]
3/ \
2 3
\ \
3 1
輸出: 7
解釋: 小偷一晚能夠盜取的最高金額 = 3 + 3 + 1 = 7.
思路
定義函式helper(node)
返回兩個值:
以node
為根節點,可能包含node
的子樹構成的最大值
以node
為根結點,不包含node
的子樹構成的最大值
可以通過遞迴的方式解決問題。
首先考慮遞迴出口,當前節點為none
, 返回0, 0
下面考慮節點非none
,通過helper
返回左子節點的兩個引數lc, lgc
,根據上面的定義,lc
可能包含左子節點的值,lgc
一定不包含左子節點的值,同理計算rc, rgc
那麼考慮當前節點的返回值。
cur = lgc + rgc + max(node.val, 0)
使用當前節點
pre = max(lc + rc, lgc + rgc, lc + rgc, rc + lgc)
不使用當前節點的所有組合
**
class
solution
:def
rob(self, root: treenode)
->
int:
defhelper
(node):if
not node:
return0,
0 lc, lgc = helper(node.left)
rc, rgc = helper(node.right)
cur = lgc + rgc +
max(node.val,0)
pre =
max(lc + rc, lgc + rc, rgc + lc, lgc + rgc)
return cur, pre
return
max(helper(root)
)
LeetCode 198 打家劫舍
題目 你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。思路 本題的大致意思就是求取乙個...
LeetCode198 打家劫舍
你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。簡單的動態規劃問題,題目意思是計算陣列...
leetcode198 213 打家劫舍
解題思路 先畫樹形結構去分析,x,n 表示考慮從x到n範圍內去偷盜,memo x,n 表示x到n範圍內偷盜金額的最大值。def rob 198 nums if len nums 0 return 0 if len nums 1 return nums 0 if len nums 2 return m...