问题:
题目来源:力扣(LeetCode)
难度:中等
分析:
相对于打家劫舍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