打家劫舍1
打家劫舍2
打家劫舍3
1
class Solution:
def rob(self, nums):
n = len(nums)
if n == 1:
return nums[0]
pre, nxt = nums[0], max(nums[0], nums[1])
for i in range(2, n):
pre, nxt = nxt, max(pre + nums[i], nxt)
return nxt
2
class Solution:
def rob(self, nums: List[int]) -> int:
n = len(nums)
if n == 1:
return nums[0]
if n == 2:
return max(nums[0], nums[1])
dp = [0] * (n - 1)
dp[0], dp[1] = nums[0], max(nums[0], nums[1])
for i in range(2,n-1):
dp[i] = max(dp[i-2] + nums[i], dp[i-1])
left = dp[-1]
dp[0], dp[1] = nums[1], max(nums[1], nums[2])
for i in range(2,n-1):
dp[i] = max(dp[i-2] + nums[i+1], dp[i-1])
return max(left, dp[-1])
3
class Solution:
def rob(self, root: TreeNode) -> int:
def helper(root):
if not root:
return [0, 0]
decision = [-1, -1]
left = helper(root.left)
right = helper(root.right)
decision[0] = max(left[0],left[1]) + max(right[0],right[1])
decision[1] = left[0] + right[0] + root.val
return decision
if not root:
return 0
else:
return max(helper(root))