198打家劫舍
class Solution:
def rob(self, nums: List[int]) -> int:
if len(nums) == 0:
return 0
if len(nums) == 1:
return nums[0]
dp = [0] * len(nums)
dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
for i in range(2, len(nums)):
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
return dp[-1]
213打家劫舍II
class Solution:
def rob(self, nums: List[int]) -> int:
if len(nums) == 0:
return 0
if len(nums) == 1:
return nums[0]
result1 = self.robRange(nums, 0, len(nums) - 2)
result2 = self.robRange(nums, 1, len(nums) - 1)
return max(result1, result2)
def robRange(self, nums, start, end):
if start == end:
return nums[start]
dp = [0] * len(nums)
dp[start] = nums[start]
dp[start + 1] = max(nums[start], nums[start + 1])
for i in range(start + 2, end + 1):
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
return dp[end]
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]) -> int:
result = self.robTree(root)
return max(result[0], result[1])
def robTree(self, node):
if not node:
return [0, 0]
left = self.robTree(node.left)
right = self.robTree(node.right)
#不偷node
val0 = max(left[0], left[1]) + max(right[0], right[1])
#偷node
val1 = node.val + left[0] + right[0]
return [val0, val1]