0337-打家劫舍罗马数字3
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为"根"。除了"根"之外,每栋房子有且只有一个"父"房子与之相连。一番侦察之后,聪明的小偷意识到"这个地方的所有房屋的排列类似于一棵二叉树"。如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。
计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。
示例1:
输入: [3,2,3,null,3,null,1]
输出: 7
解释:小偷一晚能够盗取的最高金额=3 3 1=7.
示例2:
输入: [3,4,5,1,3,null,1]
输出: 9
解释:小偷一晚能够盗取的最高金额=4 5=9.
来源:力扣(LeetCode)
链接:https://leet代码-cn。com/problems/house-barber-iii
参考:
https://leet代码-cn。com/problems/house-barber-iii/solution/Dai-ma-sui-Xiang-Lu-337-da-Jia-Jie-she-I-j60v/
python
# 0337.打家劫舍罗马数字3
类别解决方案:
内存={}
def rob(self,root: TreeNode) - int:
'''
暴力递归,O(2^n)
:参数根:
:return:
'''
如果根为非:则返回0
如果左根为无根,对为无:
返回root.val
# 偷父节点
val_1=root.val
if root.left:
val_1=self.rob(根。左。左self.rob(根。左。右)
if root.right:
val_1=self.rob(根。右。左self.rob(根。右。右)
# 不偷父节点
val_2=self.rob(根。左self.rob(根。右)
返回最大值(val_1,val_2)
def rob1(self,root: TreeNode) - int:
'''
记忆化递归
:参数根:
:return:
'''
如果不是root:则返回0
如果不是根。左也不是根。右:
返回root.val
如果自我记忆获得(根)不是无:
返回自我记忆[根]
# 偷父节点
val_1=root.val
if root.left:
val_1=self.rob1(根。左。左)self.rob1(根。左。右)
if root.right:
val_1=self.rob1(根。右。左)self.rob1(根。右。右)
# 不偷父节点
val_2=self.rob1(根。左)self.rob1(根。右)
self.memory[root]=max(val_1,val_2)
返回最大值(val_1,val_2)
def rob(self,root: TreeNode) - int:
'''
动态规划-时间O(n)
:参数根:
:return:
'''
def rob_tree(根):
如果不是root:
return (0,0) #(偷当前节点金额,不偷当前节点金额)
left=rob_tree(root.left)
右=rob_tree(root.right)
val_1=root.val左[1]右[1] #偷当前节点
val_2=最大值(左[0],左[1])最大值(右[0],右[1]) #不偷当前节点,考虑子节点
返回(val_1,val_2)
结果=rob_tree(根)
返回最大值(结果[0],结果[1])
golang
包动态编程
导入" leetcode200/binaryTree "
//动态规划-打家劫舍罗马数字3
func rob3(根*binaryTree .TreeNode) int(
var后序函数(节点* Binarytree .TreeNode) []int
postorder=func(node *binaryTree .TreeNode) []int {
如果节点==零
return []int{0,0}
}
左:=后置(节点。左)
右:=后置(节点。右)
val_1 :=节点瓦尔.左[1]右[1]
val_2 :=最大值(左[0],左[1])最大值(右[0],右[1])
return []int{val_1,val_2}
}
结果:=后置(根)
返回最大值(结果[0],结果[1])
}
func max(a,b int) int {
如果a b
返回a
}
返回b
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/132077.html