【LeetCode】213. 打家劫舍 II

news2024/11/15 2:15:39

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);
    }
};

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

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

相关文章

虹科分享|不再受支持的Windows系统如何免受攻击?| 自动移动目标防御

传统的微软操作系统(OS)可能会一直伴随着我们&#xff0c;操作系统使用统计数据显示&#xff0c;传统操作系统的总市场份额仍在10%以上。Windows的总安装基数为13亿&#xff0c;大约有1.5亿个终端仍在运行旧版操作系统。 数十万组织的终端和服务器采用不受支持的操作系统。如果…

curl方式调用电商API接口示例 详细介绍

cURL是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;1997年首次发行。它支持文件上传和下载&#xff0c;所以是综合传输工具&#xff0c;但按传统&#xff0c;习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。 cURL支持的通信协议有FTP、FTPS、HTTP、H…

数字化工厂:虹科Vuzix AR眼镜在工业制造中的革新应用

随着现代科学技术和新兴需求的快速增长&#xff0c;增强现实(AR)、各种“现实”产品与技术不断涌入创新市场&#xff0c;新兴用例数量正在快速增长&#xff0c;可以肯定&#xff0c;在可预见的未来&#xff0c;AR技术将成为各行各业的生产与工作主流。 增强现实&#xff08;AR&…

应用scrapy爬虫框架

Scrapy是一个基于Python的开源网络爬虫框架&#xff0c;它可以帮助我们快速、高效地抓取网页数据&#xff0c;并支持数据的自动化处理、存储和导出。Scrapy提供了丰富的扩展机制&#xff0c;可以轻松地实现各种自定义需求。 Scrapy的基本使用流程&#xff1a; 1、安装Scrapy框…

服务(第十五篇)HAproxy负载+高可用

HAProxy负载均衡的调度算法&#xff08;策略&#xff09;&#xff1a; &#xff08;1&#xff09;roundrobin&#xff0c;表示简单的轮询 &#xff08;2&#xff09;static-rr&#xff0c;表示根据权重 &#xff08;3&#xff09;leastconn&#xff0c;表示最少连接者先处理 &…

RestTemplate使用不当引发的504及连接池耗尽问题分析

背景 系统&#xff1a; SpringBoot开发的Web应用&#xff1b;ORM: JPA(Hibernate)接口功能简述&#xff1a; 根据实体类ID到数据库中查询实体信息&#xff0c;然后使用RestTemplate调用外部系统接口获取数据。 问题现象 浏览器页面有时报504 GateWay Timeout错误&#xff0c…

C语言函数大全-- r 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- r 开头的函数 1. raise 1.1 函数说明 函数声明函数功能int raise(int sig);用于向当前进程发送指定的信号。 参数&#xff1a; sig &#xff1a; 指定要发送的信号编号 返回值&#xff1a; 如果调用成功&#xff0c;raise() 函数将返…

霍兰德人格分析雷达图

雷达图 Radar Chart 雷达图是多特性直观展示的重要方式 问题分析 霍兰德认为&#xff1a;人格兴趣与职业之间应有一种内在的对应关系 人格分类&#xff1a;研究型、艺术型、社会型、企业型、传统型、现实性 职业&#xff1a;工程师、实验员、艺术家、推销员、记事员、社会工…

【AUTOSAR】【信息安全】SecOC

目录 一、概述 二、约束和假设 三、依赖模块 四、功能描述 4.1 安全解决方案的规范 4.1.1 安全解决方案的基本实体 4.1.2 安全的I-PDU构建 4.1.3 安全的I-PDU验证 4.2 与PduR的关系 4.3 初始化 4.4 传出PDU的身份验证 4.5 传入pdu的验证 4.6 网关功能 4.7 多核分…

【java】Java中的锁

文章目录 前言一、悲观锁二、乐观锁三、自旋锁原理自旋锁优缺点优点缺点 自旋锁时间阈值(1.6 引入了适应性自旋锁)自旋锁的开启 四、可重入锁(递归锁)五、读写锁六、公平锁七、非公平锁八、共享锁九、独占锁十、轻量级锁十一、重量级锁十二、偏向锁十三、分段锁十四、互斥锁十五…

Docker实战笔记5-利用 commit 理解镜像构成

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/130338433 本文出自【赵彦军的博客】 文章目录 慎用 docker commit 注意&#xff1a; docker commit 命令除了学习之外&#xff0c;还有一些特殊的应用场合&#xff0c;比如被入侵后保存现场等。但…

【软件测试】测试用例的设计

文章目录 一. 针对没有需求的案例来设计测试用例二. 针对有需求的案例来设计测试用例1. 穷举法2. 等价类3. 边界值4. 判定表法5. 场景设计法5.1 简介5.2 基本设计步骤5.3 基本流和备选流5.4 使用场景5.5 优缺点5.6 实例 6. 错误猜测法 一. 针对没有需求的案例来设计测试用例 针…

网络安全入行?来了解下网络安全从业人员类别及其工作任务

又到了每年重保期间&#xff0c;红蓝双方都开始进行准备蓄势待发&#xff0c;网络安全从业人员每年供不应求&#xff0c;尤其是重保期间&#xff0c;双方都在疯狂的招揽准备网络安全人员。那网络安全从业人员分类到底有哪些&#xff0c;都负责哪些具体的工作任务呢&#xff1f;…

基于云计算技术的B/S架构云HIS 云HIS 云HIS系统

传统的HIS经历了20多年的建设&#xff0c;已经从单机版发展到局域网的版本&#xff0c;更被深入应用到医院的各项业务活动&#xff0c;成为医院必不可缺的基础设施平台&#xff0c;724小时不间断地支撑医院运行。因此医院都十分重视信息化建设。随着医改的不断推进和医疗行业的…

前端路由hash模式以及history模式详解

文章目录 前言一、hash 模式1、hash 定义2、location 对象3、window.onhashchange 事件 二、history 模式1、history 定义2、history API3、window.onpopstate 事件4、解决history模式下页面刷新404问题 前言 在前后端分离的项目中&#xff0c;前端一般使用 SPA 单页面应用模式…

屌的一批,阿里P8推荐的Spring Cloud实战笔记

Spring Cloud 前世今生 Spring Cloud体系由Spring 在2015年年初推出&#xff0c;至今已经五年多&#xff0c;其子项目在不断增加与完善&#xff0c;其所包含的功能点已经基本满足整个微服务体系的需求。加上Spring本身强大的技术后盾和活跃的技术社区氛围&#xff0c;Spring C…

车载毫米波雷达中国市场有望在2025年实现30亿美元的市场规模

近日&#xff0c;专注于前沿科技领域的国际咨询机构ICV发布了全球车载毫米波雷达的市场研究报告&#xff0c;汽车毫米波&#xff08;mmWave&#xff09;雷达基于频率为77 GHz的电磁波&#xff0c;具有高精度和准确性&#xff0c;可用于目标检测。这种技术有着广泛的应用&#x…

解决方案丨票据集中在集团总部处理,如何解决实物票据管理难?

目前越来越多的企业都成立了财务共享中心&#xff0c;通过统一财务中心可以进行集中式、标准化、统一化管理&#xff0c;提升财务运营水平与效率、降低企业的整体运作成本、集团战略发展支撑。 如何确保财务共享中心稳健和高效运营&#xff0c;是很多企业建立共享中心后面的难…

【Leetcode每日一刷】动态规划:931. 下降路径最小和

博主简介&#xff1a;努力学习的22级计科生博主主页&#xff1a; 是瑶瑶子啦所属专栏: LeetCode每日一题–进击大厂 目录 一、动态规划套路二、分析1、dp数组含义2、确定递推公式&#xff08;递推函数的实现&#xff09;3、dp数组初始化&#xff08;base case)4、遍历顺序 解题…

React面向组件编程

React面向组件编程 基本理解和使用组件三大核心属性1: state效果理解强烈注意 组件三大核心属性2: props效果理解作用编码操作 组件三大核心属性3: refs与事件处理效果理解编码2.4.4. 事件处理 收集表单数据效果理解 组件的生命周期(重要&#xff09;效果理解生命周期流程图(旧…