【LeetCode】213. 打家劫舍 II
213. 打家劫舍 II(中等)



思路
这道题是 198.打家劫舍 的拓展版,区别在于:本题的房间是环形排列,而198.题中的房间是单排排列。
将房间环形排列,意味着第一间房间和最后一间房间不能同时盗窃,因此可以把这道题简化为两个单排排列的子问题。
- 可以选择第一个房间进行偷窃,也就是考虑
nums[0...n-2]; - 可以选择最后一个房间进行偷窃,也就是考虑
nums[1...n-1];
综合上述两种情况,选择偷窃金额最多的情况作为本题的答案。
状态定义
根据题解,本道题将定义两种状态:
first[i]:表示可以选择第一个房间的偷窃情况下,到第 i 个房间为止的最多金额;last[i]:表示可以选择最后一个房间的偷窃情况下,到第 i 个房间为止的最多金额;
状态转移方程
对于每个房间,都有偷窃和不偷窃两种选择,以第 i 个房间为例:
- 如果选择偷窃这个房间 i ,那么前一个房间肯定不能偷窃,所以当前的金额是第 i-2 个房间的金额加上该房间的现金,即
first[i] = first[i-2] + nums[i-1]; - 如果选择不偷窃该房间,所以当前的金额和前一个房间的金额相等,即
first[i] = first[i-1];
我们要得到偷窃到的最高金额,也就是在这两种情况中选择金额最高的,即 first[i] = max(first[i-1], first[i-2] + nums[i-1]);。
对于 last数组,它的状态转移方程是一致的。
初始化
first [0] = last[0] = 0;,第 0 个房间,也就意味着还没有实施偷窃,所以金额为 0;first[1] = nums[0] , last[1] = nums[1];first 和 last 的第一个房间的金额分别设置为 第一个房间的现金。
最终的返回结果
在题解中已经解释了,我们需要返回两种情况下的最大金额, 即 return max(first[n-1], last[n-1]); 。
代码
class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n<=3) return *max_element(nums.begin(), nums.end());vector first(n, 0);vector last(n, 0);first[1] = nums[0];for(int i=2; i<n; ++i){first[i] = max(first[i-1], first[i-2] + nums[i-1]);cout<<"i:"<<i<<" "<<first[i]<<endl;}last[1] = nums[1];for(int i=2; i<n; ++i){last[i] = max(last[i-1], last[i-2] + nums[i]);}return max(first[n-1], last[n-1]);}
};
空间压缩
由于 first[i] 只和前两个状态有关,因此可以进行空间压缩。
class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n<=3) return *max_element(nums.begin(), nums.end());int cur_first , pre1 = 0, pre2 = nums[0];for(int i=2; i<n; ++i){cur_first = max(pre2, pre1 + nums[i-1]);pre1 = pre2;pre2 = cur_first;}int cur_last;pre1 = 0, pre2 = nums[1];for(int i=2; i<n; ++i){cur_last = max(pre2, pre1 + nums[i]);pre1 = pre2;pre2 = cur_last;}return max(cur_first, cur_last);}
};
代码简化
显然,两个 for 循环的结构一致,所以可以将 for 循环写成子函数,也可以再定义两个变量,将两个 for循环整合到一起。这里只展示第二种写法:
class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n<=3) return *max_element(nums.begin(), nums.end());int cur_first ,cur_last;int pre1 = 0, pre2 = nums[0], pre3 = 0,pre4 = nums[1];for(int i=2; i<n; ++i){cur_first = max(pre2, pre1 + nums[i-1]);cur_last = max(pre4, pre3 + nums[i]);pre1 = pre2;pre2 = cur_first;pre3 = pre4;pre4 = cur_last;}return max(cur_first, cur_last);}
};
相关文章:
【LeetCode】213. 打家劫舍 II
213. 打家劫舍 II(中等) 思路 这道题是 198.打家劫舍 的拓展版,区别在于:本题的房间是环形排列,而198.题中的房间是单排排列。 将房间环形排列,意味着第一间房间和最后一间房间不能同时盗窃,因…...
从初识RabbitMQ到安装了解
一、同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,但是你却不…...
MySQL(六)-字符串函数的使用解析
字符串函数的使用解析 1 计算字符串字符数的函数和字符串长的函数2 合并字符串函数 CONCAT(s1,s2,...)、CONCAT_WS(xs1,s2,...)3 替换字符串函数INSERT(s1,x,len,s2)4 字母大小写转换函数5 获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)6 填充字符串的函数 LPAD(s1,len,s2)…...
Zookeeper集群搭建
搭建Zookeeper集群 1.1 搭建要求 真实的集群是需要部署在不同的服务器上的,但是在我们测试时同时启动很多个虚拟机内存会吃不消,所以我们通常会搭建伪集群,也就是把所有的服务都搭建在一台虚拟机上,用端口进行区分。 我们这里要…...
【计算机视觉 | 目标检测】OVD:Open-Vocabulary Object Detection 论文工作总结(共八篇)
文章目录 一、2D open-vocabulary object detection的发展和研究现状二、基于大规模外部图像数据集2.1 OVR-CNN:Open-Vocabulary Object Detection Using Captions,CVPR 20212.2 Open Vocabulary Object Detection with Pseudo Bounding-Box Labels&…...
C++入门基础知识[博客园长期更新......]
0.博客园链接 博客的最新内容都在博客园当中,所有内容均为原创(博客园、CSDN同步更新)。 C知识点集合 1.命名空间 在往后的C编程中,将会存在大量的变量和函数,因为有大量的变量和函数,所以C的库会非常多。那么在C语言编程中&a…...
( “树” 之 BST) 501. 二叉搜索树中的众数 ——【Leetcode每日一题】
二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点。 二叉查找树中序遍历有序。 ❓501. 二叉搜索树中的众数 难度:简单 给你一个含重复值的二叉搜索树(BST)的根节点 root…...
openharmony内核中不一样的双向链表
不一样的双向链表 链表初识别遍历双向链表参考链接 链表初识别 最近看openharmony的内核源码时看到一个有意思的双向链表,结构如下 typedef struct LOS_DL_LIST{struct LOS_DL_LIST *pstPrev; //前驱节点struct LOS_DL_LIST *pstNext; //后继节点 }LOS_DL_LIST;不…...
大文件删除不在回收站里怎么找回
在日常办公中,总会有一些新的文件产生,和用完后的文件清理掉。有时候不小心误删文件也是常有的事。但如果大文件删除不在回收站里怎么找回呢?遇到的小伙伴们请不要别急,只要按照下面的方法做就行了。 正常情况下删除会进入到回收站中&#x…...
Ubuntu22.04部署Pytorch2.0深度学习环境
文章目录 安装Anaconda创建新环境安装Pytorch2.0安装VS CodeUbuntu下实时查看GPU状态的方法小实验:Ubuntu、Windows10下GPU训练速度对比 Ubuntu安装完显卡驱动、CUDA和cudnn后,下面部署深度学习环境。 (安装Ubuntu系统、显卡驱动、CUDA和cudn…...
php的面试集结(会持续更新)
PHP 高级工程面试题汇总 php面试 1.大型的分页查询 发现当表中有很多上万条数据时,越后的数据用limit分页显示就越慢(>2秒),可能是mysql的特性所致。所以花了点时间总结实现了更优解决方案,最终实现毫秒级响应。…...
谁在成为产业经济发展的推车人?
区域发展的新蓝图中,京东云能做什么?它的角色是什么?这个问题背后,隐藏的不仅是京东云自身的能力和价值,更是其作为中国互联网云厂商的代表之一,对“技术产业”的新论证。 作者|皮爷 出品|产业家 关于云…...
上海无纺布制造商【盈兹】申请纳斯达克IPO上市,募资1100万美元
来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,来自上海的无纺布制造商【盈兹】,近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市,股票代码为(ETZ&#…...
Build an SAP Fiori App(一)后面更新中
1.登录 SAP BTP Trial 地址: https://account.hanatrial.ondemand.com 流程可以参考 点击 serviced marketplace 搜索studio 点击创建 点击创建,点击view subscription 点击go to application 创建完成后 添加新链接 Field Value Name ES5 - if you’…...
关于GNSS技术介绍(二)
在上期文章中,我们介绍了GNSS技术的发展历程、原理,并对不同类型的定位技术进行了介绍,在本期文章中我们将继续讨论GNSS的优点与应用及其测试方法和解决方案。 GNSS的优点与应用 目前GNSS技术已经成为日常生活不可或缺的一部分,几…...
拿到新的服务器必做的五件事(详细流程,开发必看)
目录 1. 配置免密登录 基本用法 远程登录服务器: 第一次登录时会提示: 配置文件 创建文件 然后在文件中输入: 密钥登录 创建密钥: 2.部署nginx 一、前提条件 二、安装 Nginx 3.配置python虚拟环境 1.安装虚拟环境 …...
主机防病毒攻略之勒索病毒
勒索病毒并不是某一个病毒,而是一类病毒的统称,主要以邮件、程序、木马、网页挂马的形式进行传播,利用各种加密算法对文件进行加密,被感染者一般无法解密,必须拿到解密的私钥才有可能破解。 已知最早的勒索软件出现于 …...
Win10系统重装过程(一键装机)
相信不少小伙伴都有刷机重装系统的过程,那种镜像,up盘,压缩包等多个复杂过程也折磨的大伙不堪重负,因此本期带来简易版一键装机相应操作。 下载地址: 小心点击下方链接,点击即下载(3.66GB&…...
查询优化之单表查询
建表 CREATE TABLE IF NOT EXISTS article ( id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, author_id INT(10) UNSIGNED NOT NULL, category_id INT(10) UNSIGNED NOT NULL, views INT(10) UNSIGNED NOT NULL, comments INT(10) UNSIGNED NOT NULL, title VARBI…...
ChatGPT写小论文
ChatGPT写小论文 只是个人对写小论文心得?从知乎,知网自己总结的,有问题,可以留个言我改一下 文章目录 ChatGPT写小论文-1.写论文模仿实战(狗头)0.论文组成1.好论文前提:2.标题3.摘要4.关键词5.概述6.实验数据、公式或者设计7.结论,思考8.参考文献 0.模仿1.喂大纲…...
【Prompt实战】思维链(CoT)技术应用:让AI像资深QA一样推理复杂业务逻辑
一、当大模型遇上复杂业务:一个QA的真实困境 假设你是一名资深测试工程师,收到一份需求文档,上面写着一句话:“用户申请退款时,系统应根据订单状态、支付方式、优惠券使用情况以及用户信用等级,自动判断退款金额和退款路径。” 你拿着这句话去问大模型:“帮我生成这个…...
性价比高的卫浴软件供应商
在卫浴行业数字化转型浪潮中,蓝猿BLUEAPE大力投入AI建设,其成果融入产品,为企业带来高效解决方案。降低成本,提升效率蓝猿云册多端同步,省略传统纸质画册印刷等环节,降低样品制作与分发成本,某卫…...
FreeRTOS队列深度剖析:从环形缓冲区到任务阻塞,你的消息真的发对了吗?
FreeRTOS队列深度剖析:从环形缓冲区到任务阻塞,你的消息真的发对了吗? 在嵌入式实时系统中,任务间的通信机制如同城市中的交通网络,而FreeRTOS队列则是这条网络中最核心的高速公路。当你的系统从简单的单任务演变为多任…...
如何免费解决BT下载速度慢问题?终极trackerslist配置指南
如何免费解决BT下载速度慢问题?终极trackerslist配置指南 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist 你是否曾为BT下载的龟速而烦恼?种子明明显…...
告别混淆!一文讲透 Flink State Backend 与 Checkpoint Storage
一、引言在 Flink 1.13 版本之前,StateBackend 接口是一个“大杂烩”,它同时负责两件事:状态的本地访问与存储(Task 运行时状态存在哪?内存还是 RocksDB?)Checkpoint 数据的持久化(做…...
别再重复造轮子!用PADS自带转换器+立创EDA,5分钟搞定原理图符号同步
高效复用立创EDA资源:PADS原理图符号同步实战指南 在硬件设计领域,重复绘制原理图符号堪称工程师的"时间黑洞"。当你在立创EDA上发现完美的元器件模型时,为何还要在PADS中从零开始?本文将揭示一套被多数人忽视的PADS原生…...
保姆级教程:在Windows 11上用Mosquitto搭建你的第一个MQTT服务器(含开机自启和用户管理)
Windows 11环境下Mosquitto MQTT服务器全流程部署指南 在物联网项目开发初期,本地搭建MQTT服务器进行原型测试是每个开发者都会经历的环节。作为轻量级的消息传输协议,MQTT凭借其低功耗、低带宽占用和高效的发布/订阅机制,已成为智能家居、工…...
网易云音乐无损FLAC下载工具:轻松获取专业级音乐资源
网易云音乐无损FLAC下载工具:轻松获取专业级音乐资源 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 还在为在线音乐平台的音质限制而烦恼…...
如何在5分钟内掌握ToolsFx密码学工具箱:新手完全指南
如何在5分钟内掌握ToolsFx密码学工具箱:新手完全指南 【免费下载链接】ToolsFx 跨平台密码学工具箱。包含编解码,编码转换,加解密, 哈希,MAC,签名,大数运算,压缩,二维码功…...
Hertz.dev实时音频对话实战:构建智能语音助手的最佳实践指南
Hertz.dev实时音频对话实战:构建智能语音助手的最佳实践指南 【免费下载链接】hertz-dev first base model for full-duplex conversational audio 项目地址: https://gitcode.com/gh_mirrors/he/hertz-dev Hertz.dev是一个开创性的全双工会话音频基础模型&a…...
