算法第十八天-打家劫舍Ⅱ

打家劫舍Ⅱ

题目要求

解题思路

  • 打家劫舍Ⅱ\]是说两个相邻的房间不能同时偷,并且首尾两个房间是相邻的(不能同时偷首尾房间)

所以,我们先从[打家劫舍Ⅰ]开始说起。

打家劫舍Ⅰ

题目:两个相邻的房间不能同时偷,首尾房间不相邻,求小偷能获取的最大金额。

对于[求数组中按照某种方法进行选择,求最值,而不用知道具体选择方案]的问题,可以考虑动态规划。动态规划最基本的是[状态的定义],然后比较困难的是[状态转移方程]。

状态定义\]即`dp[i]`,一般可以根据题意,题目要求什么,我们就定义什么。比如本题,我们定于`dp[i]`为**数组的前i个元素** 中按照\[两个相邻的房间不能同时偷\]的方法,能够获得到的最大值。(经验:定义`dp[i]`为数组的前i个元素的结果) 考虑\[状态转移方程\]是,一定要想办法让`dp[i]`能够基于`dp[0~i-1]`生成。本题要求不能同时偷相邻的房间。所以,dp\[i\]有两种选择:num\[i\]选或者不选。 * 如果`num[i]`选,那么由于不能选择相邻的房间,所以不可以选择`num[i-1]`,所以选择`num[i]`的情况下,数组的前i个元素构成的最大值`dp[i]=dp[i-2]+num[i]`; * 如果`num[i]`不选,那么就可以选择`num[i-1]`,所以数组的前i个元素构成的最大值 等于 数组前i-1个元素构成的最大值,即`dp[i]=dp[i-1]` * 所以,最终的`dp[i]`是上面两种情况的最大值。 \[初始条件\]比较简单: * `dp[0] = num[0]` * `dp[1] = max(dp[0],num[1]) = max(num[0], num[1])` \[返回结果\],可以根据我们的`dp[i]`知道最终要求的是在整个数组上能够取得的最大值。所以返回`dp[N-1]` #### 打家劫舍Ⅱ 在多了数组的开头和结尾是相邻的情况下,也就是说,数组的开头和结尾元素不能同时选。由于状态转移方程中,是没有标记我们到底选了哪些元素的。所以如果想通过状态转移方程,来实现首尾元素不能同时选,是很难的。 这里就用上了技巧,分为两种情况去考虑:分别在`nums[0:N-1]`上计算能获得到的最大值,这两种个情况取最大。这肯定能保证在物理上隔离了首尾两个元素,肯定不会同时选到。 ### 代码 ```python class Solution: def rob(self, nums: List[int]) -> int: N = len(nums) if not nums: return 0 if N == 1: return nums[0] return max(self.rob1(nums[0:N - 1]), self.rob1(nums[1:N])) def rob1(self,nums:List[int]): N = len(nums) if not nums: return 0 if N == 1: return nums[0] # max amount [0, i] dp = [0] * N dp[0] = nums[0] dp[1] = max(nums[0], nums[1]) for i in range(2, N): dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]) return dp[-1] ``` ### 复杂度分析 时间复杂度: O ( N ) O(N) O(N) 空间复杂度: O ( 1 ) O(1) O(1)

相关推荐
lancyu44 分钟前
C语言--插入排序
c语言·算法·排序算法
点云SLAM1 小时前
C++20新增内容
c++·算法·c++20·c++ 标准库
独好紫罗兰1 小时前
洛谷题单3-P1217 [USACO1.5] 回文质数 Prime Palindromes-python-流程图重构
开发语言·python·算法
独好紫罗兰2 小时前
洛谷题单2-P1424 小鱼的航程(改进版)-python-流程图重构
开发语言·python·算法
qystca3 小时前
蓝桥云客---九宫幻方
算法·深度优先·图论
明月清了个风3 小时前
数据结构与算法学习笔记----贪心区间问题
笔记·学习·算法·贪心算法
努力毕业的小土博^_^3 小时前
【EI/Scopus双检索】2025年4月光电信息、传感云、边缘计算、光学成像、物联网、智慧城市、新材料国际学术盛宴来袭!
人工智能·神经网络·物联网·算法·智慧城市·边缘计算
神里流~霜灭3 小时前
数据结构:二叉树(三)·(重点)
c语言·数据结构·c++·算法·二叉树·红黑树·完全二叉树
网安秘谈3 小时前
非对称加密技术深度解析:从数学基础到工程实践
算法
luckyme_3 小时前
leetcode-代码随想录-哈希表-有效的字母异位词
算法·leetcode·散列表