leetcode198 打家劫舍I
解法:
dp [i]代表到第i个房子能够取得的最大值
dp[i] 考虑两种情况偷和不偷。第i个房子偷,得到的值为dp [i-2]+nums[i];第i个房子不偷,得到的值为dp[i-1]
序列的动态规划可以不用数组去存状态,仅用两个变量
参考代码:
def rob(self, nums: List[int]) -> int:
if not nums:
return 0
curr=0
pre=0
for i in range(len(nums)):
tmp=curr
curr=max(curr,pre+nums[i])
pre=tmp
return curr
question:但是很奇怪,提交之后的空间复杂度依旧很高。看到的小伙伴如果知道原因的话,麻烦告知一下。
leetcode213 打家劫舍II
同上一题相比,条件将房子改为环状排列
意味着第一个和最后一个不能被同时盗窃
因此,分两种情况考虑
(1)第一个房子不被盗窃:计算nums[1:n]能得到的最大值
(2)最后一个房子不被盗窃:计算nums[0:n-1]能得到的最大值
最终结果为上述两个返回值的最大值