代码随想录算法训练营第48天 | 198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III

198. 打家劫舍

class Solution:
    def rob(self, nums: List[int]):
        n = len(nums)
        f = [0] * (n + 2)
        for i, x in enumerate(nums):
            f[i + 2] = max(f[i + 1], f[i] + x)
        return f[-1]

213. 打家劫舍 II

选nums[0],nums[1]和nums[-1]不能选,那么同上题nums[2: -1]

不选nums[0],同上题nums[1:]

class Solution:
    def robl(self, nums: List[int]):
        f0 = f1 = 0
        for i, x in enumerate(nums):
            f0, f1 = f1, max(f1, f0 + x)
        return f1

    def rob(self, nums: List[int]):
        return max(nums[0] + self.robl(nums[2:-1]), self.robl(nums[1:]))

337. 打家劫舍 III

记忆化搜索

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def rob(self, root: Optional[TreeNode]):
        @cache
        def dfs(node, pre):
            if node is None:
                return 0
            if pre == 1:
                return dfs(node.left, 0) + dfs(node.right, 0)
            # 选当前结点
            val1 = dfs(node.left, 1) + dfs(node.right, 1) + node.val
            # 不选
            val2 = dfs(node.left, 0) + dfs(node.right, 0)
            return max(val1, val2)
        return dfs(root, 0)

树形Dp

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def rob(self, root: Optional[TreeNode]):

        def dfs(node):
            if node is None:
                return 0, 0
            left0, left1 = dfs(node.left)
            right0, right1 = dfs(node.right)
            # 选当前结点
            val1 = left0 + right0 + node.val
            # 不选
            val0 = max(left0, left1) + max(right0, right1)
            return val0, val1
        val1, val2 = dfs(root)
        return max(val1, val2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值