LeetCode 0337 打家劫舍III

2021-10-08 21:04:43 字數 1446 閱讀 1590

題目

在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為「根」。 除了「根」之外,每棟房子有且只有乙個「父「房子與之相連。一番偵察之後,聰明的小偷意識到「這個地方的所有房屋的排列類似於一棵二叉樹」。 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。

計算在不觸動警報的情況下,小偷一晚能夠盜取的最高金額。

示例 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...