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

打家劫舍Ⅱ

题目要求

解题思路

  • [打家劫舍Ⅱ]是说两个相邻的房间不能同时偷,并且首尾两个房间是相邻的(不能同时偷首尾房间)
  • 明显是基于[打家劫舍Ⅰ]做的升级。[打家劫舍Ⅰ]也是说两个相邻的房间不能同时偷,但是首尾房间不是相邻的(可以同时偷首尾房间)

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

打家劫舍Ⅰ

题目:两个相邻的房间不能同时偷,首尾房间不相邻,求小偷能获取的最大金额。
对于[求数组中按照某种方法进行选择,求最值,而不用知道具体选择方案]的问题,可以考虑动态规划。动态规划最基本的是[状态的定义],然后比较困难的是[状态转移方程]。
[状态定义]即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]上计算能获得到的最大值,这两种个情况取最大。这肯定能保证在物理上隔离了首尾两个元素,肯定不会同时选到。

代码

class Solution:def rob(self, nums: List[int]) -> int:N = len(nums)if not nums:return 0if 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 0if N == 1:return nums[0]# max amount [0, i]dp = [0] * Ndp[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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 <script setup> 中使用 defineEmits 触发自定义事件传递数据(子传父)

在子组件中导入 defineEmits&#xff1a;在 <script setup> 的顶部&#xff0c;你需要导入 defineEmits 函数。 import { defineEmits } from vue; 定义自定义事件&#xff1a;使用 defineEmits 函数定义你想要触发的自定义事件。你可以传递一个事件名称的数组作为参数。…

常用的dom操作

常用的dom操作 查找元素&#xff1a;可以使用 getElementById、querySelector、querySelectorAll 等方法来查找元素。创建元素&#xff1a;可以使用 createElement 方法创建新的元素节点。插入元素&#xff1a;可以使用 appendChild、insertBefore 等方法将元素插入到指定位置…

Nas群晖中安装Cpolar实现内网穿透

1、到Cpolar官网中安装对应的套间 cpolar官网&#xff1a; cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站 2、到群晖nas中安装套间 选择好套间无脑下一步 已完成

时间序列数据的季节性检测

时间序列分析是统计学和数据科学的一个基本研究领域&#xff0c;它为理解和预测序列数据中的模式提供了一个强大的框架。特别是时间序列数据&#xff0c;它捕获连续时间间隔内的信息&#xff0c;使分析师能够揭示趋势&#xff0c;季节性模式和其他时间依赖性。在时间序列分析的…

rc.local 自动挂载iso

mkdir /mnt/iso echo "/usr/bin/mount -o loop /dev/sr0 /mnt/iso" >> /etc/rc.local tail -1 /etc/rc/local /usr/bin/mount -o loop /dev/sr0 /mnt/iso chmod x /etc/rc.local reboot

GPT应用开发:运行你的第一个聊天程序

本系列文章介绍基于OpenAI GPT API开发应用的方法&#xff0c;适合从零开始&#xff0c;也适合查缺补漏。 本文首先介绍基于聊天API编程的方法。 环境搭建 很多机器学习框架和类库都是使用Python编写的&#xff0c;OpenAI提供的很多例子也是Python编写的&#xff0c;所以为了…

面试 React 框架八股文十问十答第八期

面试 React 框架八股文十问十答第八期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;组件通信的方式有哪些…

PTA(浙大版《C语言程序设计(第3版)》题目集

PTA(浙大版《C语言程序设计&#xff08;第3版&#xff09;》题目集 学习C语言程序设计的PTA题目 目录 PTA(浙大版《C语言程序设计&#xff08;第3版&#xff09;》题目集PTA(浙大版《C语言程序设计&#xff08;第3版&#xff09;》题目集) 习题2-1 求整数均值 (10 分)输入格式:…

JS常用插件 Swiper插件 实现轮播图

Swiper介绍 Swiper 是一款免费以及轻量级的移动设备触控滑块的js框架 中文官网地址: https://www.swiper.com.cn/ 点击查看Swiper演示&#xff0c;里面的功能和样式十分丰富&#xff0c;根据自己的需求选择 中文教程中详细介绍了如何使用Swiper API文档中介绍了各个模块以及参…

如何画出优秀的系统架构图-架构师系列-学习总结

--- 后之视今&#xff0c;亦犹今之视昔&#xff01; 目录 早期系统架构图 早期系统架构视图 41视图解读 41架构视图缺点 现代系统架构图的指导实践 业务架构 例子 使用场景 画图技巧 客户端架构、前端架构 例子 使用场景 画图技巧 系统架构 例子 定义 使用场…

C++面试宝典第19题:最长公共前缀

题目 编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串""。说明:所有输入只包含小写字母a-z。 示例1: 输入: ["flower", "flow", "flight"]输出: "fl" 示例2: 输入: ["dog",…

微信小程序快速入门03

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、生命周期生…

手写springBoot启动器

提示&#xff1a;springboot原理&#xff0c;手写springboot启动器&#xff0c;手写模拟SpringBoot启动过程、手写模拟SpringBoot自动配置功能 文章目录 前言一、本文内容1、手写模拟SpringBoot启动过程2、手写模拟SpringBoot自动配置功能 二、项目总体介绍三、代码实现(手写模…

R语言【paleobioDB】——pbdb_scale():通过ID选择,返回一个时间刻度的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_scale (id, ...) Arguments 参数【id】&a…

python的库或函数不会用:使用help函数查看函数

help(time) # 查看time这个库 FUNCTIONS #函数&#xff1b;都可以调用asctime(...)asctime([tuple]) -> string #调用这个函数的参数需要一个元组&#xff08;tuple&#xff09;&#xff0c;->&#xff1a;代表返回值是string类型的#下面是简单的介绍Convert a time tup…

k8s的存储卷、数据卷---动态PV创建

当发布PVC之后可以生成PV&#xff0c;还可以在动态服务器上直接生成挂载目录。PVC直接绑定和使用PV。 动态PV需要两个组件 存储卷插件&#xff1a;Provisioner(存储分配器)根据定义的属性创建PV StorageClass&#xff1a;定义属性 存储卷插件 存储卷插件&#xff1a;k8s本…

ElasticSearch降本增效常见的方法 | 京东云技术团队

Elasticsearch在db_ranking 的排名不断上升&#xff0c;其在存储领域已经蔚然成风且占有非常重要的地位。 随着Elasticsearch越来越受欢迎&#xff0c;企业花费在ES建设上的成本自然也不少。那如何减少ES的成本呢&#xff1f;今天我们就特地来聊聊ES降本增效的常见方法&#x…

服务器和电脑有啥区别?

服务器可以说是“高配的电脑”&#xff0c;两者都有CPU、硬盘、电源等基础硬件组成&#xff0c;但服务器和电脑也是有一定区别的&#xff0c;让小编带大家了解一下吧&#xff01; #秋天生活图鉴# 1、稳定性需求不同&#xff1a;服务器是全年无休&#xff0c;需要高稳定性&…

世微大功率 内置2.5A宽电压降压恒流 LED电源驱动车灯IC AP5193

AP5193是一款PWM工作模式,高效率、外围简单、 内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度 降压LED恒流驱动芯片。电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光 脚有效电压范围0.55-2.6V. AP5193 工作频率可以通过RT 外部电阻编程来设定&#xff0c…

快乐学Python,数据分析之使用爬虫获取网页内容

在上一篇文章中&#xff0c;我们了解了爬虫的原理以及要实现爬虫的三个主要步骤&#xff1a;下载网页-分析网页-保存数据。 下面&#xff0c;我们就来看一下&#xff1a;如何使用Python下载网页。 1、网页是什么&#xff1f; 浏览器画网页的流程&#xff0c;是浏览器将用户输…