Leetcode刷题详解——打家劫舍 II

1. 题目链接:213. 打家劫舍 II

2. 题目描述:

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 3:

输入:nums = [1,2,3]
输出:3

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

3. 解法(动态规划):

3.1 算法思路:

这个问题是一个环形问题,但是我们可以将环形问题转化为两个单排的问题:

偷第一个房屋时的最大金额x,此时不能偷最后一个房子,因此就是偷[0,n-2]区间

不偷第一个房屋时的最大金额y,此时可以偷最后一个房子,因此就是偷[1,n-1]区间的房子

两种情况的最大值,就是最终的结果

请添加图片描述

3.2 C++算法代码:

class Solution {
public:
    int rob(vector<int>& nums) {
        // 获取数组长度
        int n = nums.size();
        // 返回两种情况的最大值:偷第一个房子和不偷第一个房子
        return max(nums[0] + rob1(nums, 2, n - 2), rob1(nums, 1, n - 1));
    }

    // 定义一个辅助函数,用于计算从left到right范围内能偷到的最大金额
    int rob1(vector<int>& nums, int left, int right) {
        // 如果left大于right,说明没有房屋可以偷,返回0
        if (left > right) return 0;
        // 获取数组长度
        int n = nums.size();
        // 初始化动态规划数组f和g
        vector<int> f(n);
        auto g = f;
        // 将第一个房屋的金额赋值给f[left]
        f[left] = nums[left];
        // 从left+1开始遍历到right,更新动态规划数组f和g的值
        for (int i = left + 1; i <= right; i++) {
            f[i] = g[i - 1] + nums[i]; // 当前房屋的最大金额等于前一个房屋的最大金额加上当前房屋的金额
            g[i] = max(f[i - 1], g[i - 1]); // 当前房屋的最大金额等于前一个房屋的最大金额和前前个房屋的最大金额中的较大值
        }
        // 返回right位置的最大金额,即偷到的最大金额
        return max(f[right], g[right]);
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

火电安全事故vr模拟仿真培训强交互更真实

VR消防&#xff0c;利用VR虚拟现实技术&#xff0c;将VR和消防教育融合在一起达到寓教于乐的效果&#xff0c; VR消防教育是对于家中、校园内、大型商场、公司办公室等情景产品研发的消防安全培训类VR系统软件&#xff0c;根据互动体验、互动、视角实际操作、视听觉系统多度自然…

什么是域欺骗?域欺骗的主要类型有哪些?

域欺骗是指网络犯罪分子假冒网站名称或电子邮件域来欺骗用户。域欺骗的目的是将恶意电子邮件或网络钓鱼网站伪装成合法电子邮件或网站&#xff0c;诱使用户与之交互。域欺骗就像骗子一样&#xff0c;向人们展示伪造的凭据以获得信任&#xff0c;然后再利用其获得好处。 域欺骗…

photoshop插件开发入门(java,android,ios)

photoshop给我们提供了一个服务&#xff0c;让我们可以通过java或者c#等语言发送JavaScript等脚本给photoshop&#xff0c;让photoshop自动帮我们处理图片。这里的资料主要是如何连接photoshop&#xff0c;如果开发和调试JavaScript脚本。 photoshop 学习资料和sdk&#xff08…

网络工程师网络配置经典例题(一)附有详细注释

一、配置管理IP和Telnet 配置设备管理IP地址后&#xff0c;可以通过管理IP远程登录设备。 &#xff08;1&#xff09;配置管理IP地址 <HUAWEI> system-view [HUAWEI] vlan 5 //创建交换机管理VLAN 5 [HUAWEI-VLAN5] management-vlan [HUAWEI-VLAN5…

一篇博客读懂双向链表

目录 一、双向带头循环链表的格式 二、链表的初始化和销毁 2.1链表的初始化 2.2链表的销毁 三、链表的检查与准备 3.1链表的打印 3.2创建新结点 四、链表增删查改 4.1尾插 4.2尾删 4.3头插 4.4头删 4.5查找 4.6任意位置前插入 4.7删除任意位置 一、双向带…

emq Neuron工业协议采集使用

emq Neuron工业协议采集使用 Neuron 简介 EMQ X Neuron 是运行在各类物联网边缘网关硬件上的工业协议商业化网关软件&#xff0c;支持一站式接入和解析数十种工业协议&#xff0c;并转换成 MQTT 协议接入工业物联网平台。用户可以通过基于 Web 的管理控制台可以实现在线的网关…

leetcode刷题日记:202. Happy Number( 快乐数)和203. Remove Linked List Elements(移除链表元素)

202. Happy Number( 快乐数) 这一题的解决与之前的循环链表比较类似&#xff0c;因为如果不是快乐数的话&#xff0c;在数字变化的过程中必然遇到了数字变换的循环&#xff0c;所以我们需要在变换的过程中判断是否遇到了循环&#xff0c;判断是否在一个序列中存在循环&#xf…

[uni-app] uni.showToast 一闪而过问题/设定时间无效/1秒即逝

toast一闪就消失 1.猜测频繁点击导致 – 排除 2.猜测再定时器内导致-- 排除 3.和封装的接口调用一起导致 - 是改原因 深挖发现: axios封装中, 对loading/hindloading进行了配置, 看来是 showToast 与 loading等冲突导致的 wx.hideLoading(Object object) 解决办法 再封装的…

前端CSS实现响应式TimeLine效果(附源码)

文章目录 纯CSS搭建,先上效果图(附有源码)视图层 index.htmlindex.css 公用样式文件Main.css 主要的样式文件纯CSS搭建,先上效果图(附有源码) 本效果为纯CSS搭建,适配移动端和PC端! 视图层 index.html <body class="light"><header class="he…

Scrum敏捷开发培训团队和组织来说的重要性

Scrum敏捷开发培训对于团队和组织来说是至关重要的&#xff0c;有以下几点&#xff0c;大家可以参考下&#xff1a; 理解敏捷价值观和原则&#xff1a; 培训有助于团队理解敏捷方法背后的核心理念和价值观&#xff0c;包括个体和互动、工作软件、客户合作和响应变化。这有助于建…

智慧商场数字孪生三维可视化大屏管理系统提升品牌形象

聚焦国家战略需求和先进制造业发展方向&#xff0c;加快数字化发展战略部署&#xff0c;数字孪生、工业互联网、工业物联网已被广泛认为是工业革命的新引擎。数字孪生公司正在推动工业制造从制造转向智造。通过数字化建模和仿真的方式&#xff0c;优化设计、生产、质量管理、供…

《opencv实用探索·一》QT+opencv实现图片拼接和Mat转QImage

本文利用opencv实现了几个好用的功能&#xff0c;包含两个文件&#xff0c;如下&#xff1a; 源码放在文章末尾 imageProcessing类包含三个功能&#xff1a; 1、图像拼接 cv::Mat imageMosaic(cv::Mat mat1, cv::Mat mat2, MosaicMode mosaicMode);mat1和mat2为两个待拼接的…

美国DDoS服务器:如何保护你的网站免遭攻击?

​  在当今数字化时代&#xff0c;互联网已经成为人们生活中不可或缺的一部分。随着互联网的普及和发展&#xff0c;网络安全问题也日益严重。其中&#xff0c;DDoS攻击是目前最常见和具有破坏性的网络攻击之一。那么&#xff0c;如何保护你的网站免遭DDoS攻击呢?下面将介绍…

CMMI之项目管理类核心框架

项目管理类过程域涵盖了与项目的计划、监督和控制相关的项目管理活动。 CMMI-DEV 中的七个项目管理类过程域是&#xff1a; • 集成项目管理&#xff08;Integrated Project Management&#xff0c; IPM&#xff09; • 项目监督与控制&#xff08;Project Monitoring and Cont…

23.11.19日总结(vue2和vue3的区别,项目中期总结)

经过昨天的中期答辩&#xff0c;其实可以看出来项目进度太慢了&#xff0c;现在是第十周&#xff0c;预计第十四周是终级答辩&#xff0c;在这段时间要把项目写完。 前端要加上一个未登录的拦截器&#xff0c;后端加上全局的异常处理。对于饿了么项目的商品建表&#xff0c;之前…

亚马逊高级API申请

一、背景介绍 亚马逊公司提供了丰富的API接口&#xff0c;以便开发者能够轻松地与其服务进行集成。这些API接口包括各种功能&#xff0c;如商品信息查询、订单处理、客户关系管理等。本文旨在帮助您如何申请亚马逊的高级API&#xff0c;并确保您的应用符合亚马逊公司的要求和标…

一图多码如何分解?快速做二维码解码的方法

当遇到一张图片里面有多个二维码时&#xff0c;想要将图片中的二维码分解成链接或者文本&#xff0c;该如何来操作呢&#xff1f;一般解决这个问题的方法多会通过使用二维码解码器来完成操作&#xff0c;那么对于还不知道的怎么操作的小伙伴&#xff0c;下面的方法可以来学习一…

【linux】 mpstat 使用

​mpstat mpstat 可以查看所有cpu的平均负载&#xff0c;也可以查看指定cpu的负载。所以mpstat其实就是主要查看CPU负载的一个工具。是一款常用的多核CPU性能分析工具&#xff0c;用来实时查询每个CPU的性能指标&#xff0c;以及所有CPU的平均指标。 mpstat 是sysstat中的一个工…

数据结构:lambda表达式

基本概念 语法 // 1. 不需要参数,返回值为 2 () -> 2 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数字),并返回他们的和 (x, y) -> x y // 4. 接收2个int型整数,返回他们的乘积 (int x, int y) -> x * y // 5. 接受一个 string 对…

支持导入ics文件的提醒待办类工具

上个月腾讯待办突然发布因业务发展方向调整&#xff0c;腾讯待办将于2023年12月20日停运并下架&#xff0c;如需保存数据请在停运日期前导出数据&#xff0c;打开腾讯待办后会弹出保存数据的操作提示。 官方发布消息后&#xff0c;很多人不禁疑问&#xff1a;腾讯待办停运后还…