337 打家劫舍 III

2021-09-26 06:37:11 字數 584 閱讀 8870

思路

這是乙個典型的樹形dp問題,對每乙個節點都有兩種選擇:選他或者不選他。選他的話, 那麼就不能選擇它的父節點、兄弟節點和子節點;不選這個節點,那麼就可以選擇該節點的左右子樹(選最大的),建立乙個dp表,令dp[0]表示選,dp[1]表示不選。

class solution(object):

def rob(self, root):

""":type root: treenode

:rtype: int

"""#很經典的樹形dp

def dp(root):

if not root:

return [0, 0]

l = dp(root.left)

r = dp(root.right)

return [root.val + l[1] + r[1], max(l) + max(r)]

return max(dp(root))

337 打家劫舍 III

方法一 遞迴 超時!class solution 方法二 用雜湊表改進解決重複子問題,超時!class solution return res public int rob treenode root 方法三 用乙個pair分別記錄包含根節點和不包含根節點時的最大值 class solution a...

337 打家劫舍 III

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

337 打家劫舍 III

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