213. 打家劫舍 II
- 题目链接
- 解题思路:来到index位置,决定偷,或者不偷。但是有一个问题,来到最后一个位置的时候,可以偷吗?因为房屋是一个圆圈,如果第一个位置偷了,那么最后一个位置就不能偷,那么暴力递归时,怎么知道呢?
-
- 将问题解耦成两个问题,第一个房间偷+第一个房间不偷。第一个房间偷,那么最后一个房间必不能偷;第一个房间偷最后一个房间就可以考虑偷
- 暴力递归加上记忆化搜索表,就是动态规划了。
-
代码
-
class Solution:
# 来到index位置,决定偷不偷,终止位置是n。 def process(self, nums: List[int], index: int, dp: List[int], n: int) -> int: if index >= n: return 0 if dp[index] != -1: return dp[index] # 偷 yes = nums[index] + self.process(nums, index + 2, dp, n) # 不偷 no = self.process(nums, index + 1, dp, n) dp[index] = max(yes, no) return dp[index] def rob(self, nums: List[int]) -> int: n = len(nums) dp = [-1 for i in range(n)] dp2 = [-1 for i in range(n)] # 第一家偷 终止位置就是n-1 yes = nums[0] + self.process(nums, 2, dp, n - 1) # 第一家不偷 终止位置就是n no = self.process(nums, 1, dp2, n) return max(no, yes)
标签:
leetcode刷题
, 数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix