力扣第213题 打家劫舍2

embedded/2024/11/9 16:45:37/

前言

记录一下刷题历程 力扣第213题 打家劫舍2


打家劫舍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 那是一个头尾不相连的问题,而这次打家劫舍2是一个首尾相连的环.以示例1为例,当我们偷1号房子时 2号3号房子都不能偷。当我们偷2号房子时,1号和3号都不能偷,所以只能偷一个房屋,并且偷金额最大的那个房屋。因为我们第一间房和最后一间房是不能都偷的,所以我们可以换一个思路,请看下图:
在这里插入图片描述
我们可以把这个环分成两个新的数组,然后使用打家劫舍1里的动态规划的方法,再从这两个数组中选择金额最大的返回它。

代码如下:

class Solution {
public:// 主函数,输入一个整数数组表示每个房屋的钱财,返回能够抢劫到的最大金额int rob(vector<int>& nums) {// 如果只有一个房屋,直接返回这个房屋的钱财if(nums.size() == 1){return nums[0];}// 创建两个新数组:nums1表示从第二个房屋到最后一个房屋,nums2表示从第一个房屋到倒数第二个房屋vector<int> nums1(nums.begin() + 1, nums.end());vector<int> nums2(nums.begin(), nums.end() - 1);// 返回两个子问题的最优解的最大值return max(help(nums1), help(nums2));}// 辅助函数,用于计算一个线性排列的房屋数组的最大抢劫金额int help(vector<int>& nums){// 创建一个动态规划数组 dp,长度为房屋数量 + 1,用于存储每个位置的最优解vector<int> dp(nums.size() + 1, 0);// 如果房屋数组不为空,初始化 dp 的第一个元素为第一个房屋的钱财if(nums.size() > 0){dp[1] = nums[0];}// 从第二个房屋开始,遍历整个房屋数组for(int i = 2; i < nums.size() + 1; i++){// dp[i] 表示抢劫前 i 个房屋所能获得的最大金额// 递推公式:dp[i] = max(不抢劫当前房屋时的金额, 抢劫当前房屋时的金额)dp[i] = max(dp[i-1], dp[i-2] + nums[i-1]);}// 返回抢劫完所有房屋后的最大金额return dp[nums.size()];}
};

解释注释

1.int help(vector& nums)

辅助函数:具体解释可以看之前的打家劫舍1

2.vector nums1(nums.begin() + 1, nums.end());vector nums2(nums.begin(), nums.end() - 1);

创建两个新的数组一个是从第二个房屋到最后一个房屋,另一个是从第一个到最后一个房屋。

时间复杂度


http://www.ppmy.cn/embedded/108579.html

相关文章

Debian 12如何关闭防火墙

在Debian 12中&#xff0c;默认的防火墙管理工具是ufw&#xff08;Uncomplicated Firewall&#xff09;。您可以使用以下命令来关闭防火墙&#xff1a; 关闭防火墙&#xff1a; sudo ufw disable查看防火墙状态&#xff1a; sudo ufw status如果需要重新开启防火墙&#xff1a;…

SpringBoot MybatisPlus 打印SQL及参数

SpringBoot MybatisPlus 打印SQL及参数 import java.text.DateFormat; import lombok.extern.slf4j.Slf4j;import cn.hutool.core.collection.CollUtil;import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Properties; import java.uti…

利用javacv实现视频转h264

网上找到的一个实用的视频转换工具类&#xff0c;可将视频转为h264编码&#xff08;方便在浏览器下播放视频&#xff09;。 import org.bytedeco.ffmpeg.avcodec.AVCodecParameters; import org.bytedeco.ffmpeg.avformat.AVFormatContext; import org.bytedeco.ffmpeg.avform…

[论文笔记]QLoRA: Efficient Finetuning of Quantized LLMs

引言 今天带来LoRA的量化版论文笔记——QLoRA: Efficient Finetuning of Quantized LLMs 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 我们提出了QLoRA&#xff0c;一种高效的微调方法&#xff0c;它在减少内存使用…

MySQL数据备份的存储管理:策略、实践与自动化

数据备份是数据库管理中的关键环节&#xff0c;它确保了在数据丢失或损坏的情况下能够恢复数据。在MySQL中&#xff0c;有效的数据备份存储管理不仅涉及到备份的创建&#xff0c;还包括备份的存储、组织、维护和验证。本文将详细介绍如何在MySQL中实现数据备份的存储管理&#…

【自动驾驶】控制算法(七)离散规划轨迹的误差计算

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

【C++二分查找】2439. 最小化数组中的最大值

本文涉及的基础知识点 C二分查找 LeetCode2439. 最小化数组中的最大值 给你一个下标从 0 开始的数组 nums &#xff0c;它含有 n 个非负整数。 每一步操作中&#xff0c;你需要&#xff1a; 选择一个满足 1 < i < n 的整数 i &#xff0c;且 nums[i] > 0 。 将 num…

四、Maven依赖管理、统一维护、依赖下载失败原因及解决

1.依赖管理&#xff1a; &#xff08;1&#xff09;组件选型&#xff1a;https://start.aliyun.com/https://start.aliyun.com/ &#xff08;2&#xff09;依赖选型&#xff1a;依赖GAV使用maven-search插件生成。 <!--打包方式默认&#xff1a;jarjar指的是普通的java项目…