【面试代码题记录】lc打家劫舍1&2&3

面试考官考了leetcode打家劫舍系列的1/2,索性把这类题整理一下。
ps:动归果然是常考点

lc198 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

分析:

  • 确定dp数组:目标是小偷要偷到最多的钱,因此dp[i]表示小偷偷前i个房子的最高金额。
  • 递推方程式:题目约束是小偷不能偷相邻两间房子,因此当小偷处于第i间房子决策他是否要偷第i间房子的钱时,要考虑他是否偷了第i-1间房子的钱。那么计算dp[i]时,有两种情况(1)小偷偷了第i-1间房的钱,不能偷第i间房的钱(2)小偷没偷第i-1间房的钱,可以偷第i间房的钱。二者取最大。
    dp[i] = max(dp[i-2]+nums[i], dp[i-1])
  • dp初始化:i=0时,小偷无房可偷dp[0] = 0; i=1时,小偷偷第一间房dp[1] = nums[0];i=2时,因为不能偷连续两间房,dp[2]=max(nums[0],nums[1])
  • 遍历方式:顺序遍历
class Solution:
    def rob(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 0:
            return 0
        dp = [0] * (n+1)
        for i in range(1,n+1):
            if i == 1:
                dp[i] = nums[0]
            elif i == 2:
                dp[i] = max(nums[0]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值