Leetcode213、打家劫舍II(Python题解)字节跳动面试题

本篇博客详细介绍了LeetCode213题目——打家劫舍II的中等难度算法问题,主要探讨了在环形房屋布局下如何利用动态规划求解最大盗窃金额。分析了首尾房屋的特殊处理,并给出了两种解法,包括基本动态规划和空间优化到O(1)的解决方案。
摘要由CSDN通过智能技术生成

问题
在这里插入图片描述

题目来源:力扣(LeetCode)

leetcode213.打家劫舍II

难度:中等

分析
相对于打家劫舍I的变化是将房子变成了环形,这就导致我们的首尾要单独处理。如果抢第一家,那么最后一家一定不能抢,如果抢最后一家,那么第一家不能抢。那么我们可以把情况分为第一家不抢,计算其他家最大值和最后一家不抢计算其他家最大值,打破环形结构带来的约束。首尾两家不可能同时被抢,我们不用担心这种情况被遗漏。首尾两家可能同时都不被抢,这在两种情况中都可以包含,虽然有重叠问题的计算。
状态空间:
dp[i]: 前i个房子能偷盗的最高金额
递推公式:
分为当前房子偷和不偷的情况,如果偷就那么前一个房子就不能偷,所得金额由dp[i - 2]决定,如果不偷,那么就有dp[i - 1]决定。
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
最后取max(myrob(nums[1:]), myrob(nums[:-1]))
base case:
需要初始化dp[0]和dp[1]
空间优化:
可以用两个变量滚动存数相邻房子的金额,将空间复杂度降为O(1)

解决方法
1:DP

递推公式为
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])

#DP
#分成偷和不偷第i间房的情况
class Solution:
    def rob(self, nums: List[int]) -> int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值