题解
思路
代码
- 打家劫舍
class Solution:
### 0101 动态规划(28 ms,14.8 MB)
def rob(self, nums: List[int]) -> int:
cur = pre = 0
for num in nums:
# max中:cur表示不偷当前这一家,仅保留上一家的最大金额
# max中:pre + num表示偷当前这一家并保留上两家的最大金额
cur, pre = max(cur, pre + num), cur
return cur
- 打家劫舍 II
class Solution:
### 0110 动态规划(44 ms,14.8 MB)
def rob(self, nums: List[int]) -> int:
# 抢单排连续数组的函数
def _rob(nums):
pre = cur = 0
for num in nums:
cur, pre = max(cur, pre + num), cur
return cur
# nums[:-1]表示不抢最后一间,nums[1:]表示不抢第一间
return max(_rob(nums[:-1]), _rob(nums[1:])) if len(nums) != 1 else nums[0]
- 打家劫舍 III
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
### 0110 动态规划(56 ms,16.6 MB)
def rob(self, root: TreeNode) -> int:
def _rob(root):
if not root:
return 0, 0 # 偷,不偷
l, r = _rob(root.left), _rob(root.right)
# 偷当前节点,则左、右子节点都不能偷,但能偷左、右子树剩下的值
steal = root.val + l[1] + r[1]
# 不偷当前节点,则取左、右子节点均能偷(也可以不偷),且能偷左、右子树剩下的值
not_steal = max(l) + max(r)
return steal, not_steal # 偷,不偷
return max(_rob(root))