198. 打家劫舍
class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) == 1:
return nums[0]
elif len(nums) == 2:
return max(nums[0], nums[1])
# dp数组记录当考虑第i个房屋的时候最大rob的值
dp = [0 for _ in range(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-1], dp[i-2]+nums[i])
return dp[-1]
213. 打家劫舍ii
class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) == 1:
return nums[0]
# 返回在nums[start:end+1]中rob到的最大的值
def robRange(start, end):
if start == end:
return nums[start]
dp = [0 for _ in range(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 - 1], dp[i - 2] + nums[i])
return dp[end]
res1 = robRange(0, len(nums) - 2) # 不rob最后一个房子的情况
res2 = robRange(1, len(nums) - 1) # 不rob第一个房子的情况
return max(res1, res2)
337. 打家劫舍iii
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution(object):
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""
def robTree(curNode):
if not curNode:
return [0, 0]
left = robTree(curNode.left)
right = robTree(curNode.right)
# 不rob当前节点,rob或不rob左节点,rob或不rob右节点
res0 = max(left) + max(right)
# rob当前节点,则不能rob左右节点
res1 = left[0] + right[0] + curNode.val
return [res0, res1]
res = robTree(root)
return max(res[0], res[1])