198. 打家劫舍(House Robber)

198. 打家劫舍(House Robber)

题解

动态规划

d p [ i ] dp[i] dp[i]表示到第 i i i个房屋的偷窃最高金额。
显然,递推公式为: d p [ i ] = m a x ( d p [ i − 2 ] + n u m s [ i − 1 ] , d p [ i − 1 ] ) dp[i]=max(dp[i-2]+nums[i-1],dp[i-1]) dp[i]=max(dp[i2]+nums[i1],dp[i1])
含义为,当前房屋的最高金额为前前个房屋的最高金额加上当前房屋的财富和上一个房屋的最高偷窃金额中的最大值。

  1. 特判,若数组为空,返回 0 0 0

  2. 初始化 d p = [ 0 , ⋯   , 0 ] dp=[0,\cdots,0] dp=[0,,0] n + 1 n+1 n+1的全零数组。

  3. 初始化第一个房屋的最高偷窃金额: d p [ 1 ] = n u m s [ 0 ] dp[1]=nums[0] dp[1]=nums[0]

  4. 遍历 d p dp dp,遍历区间 [ 2 , n + 1 ) [2,n+1) [2,n+1)

    • d p [ i ] = m a x ( d p [ i − 2 ] + n u m s [ i − 1 ] , d p [ i − 1 ] ) dp[i]=max(dp[i-2]+nums[i-1],dp[i-1]) dp[i]=max(dp[i2]+nums[i1],dp[i1])
  5. 返回 d p [ n ] dp[n] dp[n]

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

Python

class Solution:
    def rob(self, nums: List[int]) -> int:
        if(not nums):
            return 0
        n=len(nums)
        dp=[0]*(n+1)
        dp[1]=nums[0]
        for i in range(2,n+1):
            dp[i]=max(dp[i-2]+nums[i-1],dp[i-1])
        return dp[-1]

Java(待完成)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值