【动态规划】力扣.213. 打家劫舍 II

devtools/2024/9/23 2:07:02/

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

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

示例 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

在这里插入图片描述

代码

class Solution {
public:int rob(vector<int>& nums) {if(nums.empty()){return 0;}if(nums.size() == 1){return nums[0];}vector<int>dp1(nums.size());int count1 = 0;//第一个房子被偷,最后一个房子不被偷dp1[0] = nums[0];dp1[1] = nums[0];for(int i = 2;i < nums.size();i++){dp1[i] = max(dp1[i - 2] + nums[i], dp1[i - 1]);}count1 = dp1[nums.size() - 2];//第一个房子不被偷,最后一个房子不一定被偷vector<int>dp2(nums.size());int count2 = 0;dp2[0] = 0;dp2[1] = nums[1];for(int i = 2;i < nums.size();i++){dp2[i] = max(dp2[i - 2] + nums[i], dp2[i - 1]);}count2 = dp2[nums.size() - 1];return max(count1,count2);}
};

时间复杂度O(n);
空间复杂度O(n);

具体步骤和思路跟打家劫舍1的相同(主页有打家劫舍1的三种算法的详细思路),唯一区别是增加了首尾房子不能同时被偷的限制,所以可以分类讨论,然后返回出能偷到最大的金额即可。

根据上面代码可以发现空间复杂度O(n)来源于vector<int>dp1(nums.size()); ,可以进一步优化成O(1)。

优化代码

class Solution {
public:int rob(vector<int>& nums) {if(nums.empty()){return 0;}if(nums.size() == 1){return nums[0];}int count1 = 0;//第一个房子被偷,最后一个房子不被偷int first = nums[0];int second = nums[0];for(int i = 2;i < nums.size();i++){int temp = second;second = max(first + nums[i], second);first = temp;}count1 = first;//第一个房子不被偷,最后一个房子不一定被偷vector<int>dp2(nums.size());int count2 = 0;first = 0;second = nums[1];for(int i = 2;i < nums.size();i++){int temp = second;second = max(first + nums[i], second);first = temp;}count2 = second;return max(count1,count2);}
};

时间复杂度:O(n);
空间复杂度:O(1);

旧的代码在计算 dp1 和 dp2 时需要动态分配两个大小为 nums.size() 的数组,这会带来额外的内存分配和管理开销。新的代码通过使用固定数量的变量来代替数组,避免了这种开销,从而提高了运行效率。


http://www.ppmy.cn/devtools/85080.html

相关文章

Python应用开发——30天学习Streamlit Python包进行APP的构建(20):配置

Configuration配置 config.toml config.toml 是一个可选文件,你可以为工作目录或全局开发环境定义它。当 config.toml 文件同时在全局和工作目录中定义时,Streamlit 会合并配置选项,并优先使用工作目录配置。此外,你还可以使用环境变量和命令行选项来覆盖其他配置选项。更…

React系列面试题

大家好&#xff0c;我是有用就点赞&#xff0c;有用就扩散。 1.React的组件间通信都有哪些形式&#xff1f; 父传子&#xff1a;在React中&#xff0c;父组件调用子组件时可以将要传递给子组件的数据添加在子组件的属性中&#xff0c;在子组件中通过props属性进行接收。这个就…

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)即将召开!

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)将于2024年12月13-15日在日本冈山的冈山大学举行。NLPIR 2024将为自然语言处理与信息检索领域的专家学者提供一个交流与合作的平台&#xff0c;推动该领域的学术进步和技术创新。同时&#xff0c;本次会议也将为相关企业…

PHP框架中的数据加密实践:确保数据安全的艺术

引言 数据加密是保护敏感信息不被未授权访问的关键技术。在PHP框架中实现数据加密不仅可以增强应用的安全性&#xff0c;也是遵守数据保护法规的必要措施。本文将深入探讨在PHP框架中实现数据加密的方法&#xff0c;包括加密算法的选择、密钥管理、以及如何在应用程序中集成加…

Vue的安装配置

1.安装node js Node.js — 在任何地方运行 JavaScript (nodejs.org) 2.测试nodejs是否安装成功 node -v npm -v3.通过npm 安装 vue npm install -g vue/cli4.测试vue是否安装成功 vue --version5.打开PyCharm&#xff0c;创建项目&#xff1a;flask-web vue create flask…

星环科技携手东华软件推出一表通报送联合解决方案

随着国家金融监督管理总局“一表通”试点工作的持续推进&#xff0c;星环科技携手东华软件推出了基于星环科技分布式分析型数据库ArgoDB和大数据基础平台TDH的一表通报送联合解决方案&#xff0c;并已在多地实施落地中得到充分验证。 星环科技与东华软件作为战略合作伙伴&…

【HarmonyOS学习】用户文件访问

概述 文件所有者为登录到该终端设备的用户&#xff0c;包括用户私有的图片、视频、音频、文档等。 应用对用户文件的创建、访问、删除等行为&#xff0c;需要提前获取用户授权&#xff0c;或由用户操作完成。 用户文件访问框架 是一套提供给开发者访问和管理用户文件的基础框…

netty入门-4 Channel与ChannelFuture

Channel 基本类似于NIO中的Channel概念。作为读写数据的通道。 常见方法 close() 可以用来关闭 channelcloseFuture() 用来处理 channel 的关闭 sync 方法作用是同步等待 channel 关闭而 addListener 方法是异步等待 channel 关闭 pipeline() 方法添加处理器write() 方法将数…