Leetcode.198 打家劫舍

题目链接

Leetcode.198 打家劫舍 mid

题目描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

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

示例 1:

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

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:
  • 1 ≤ n u m s . l e n g t h ≤ 100 1 \leq nums.length \leq 100 1nums.length100
  • 0 ≤ n u m s [ i ] ≤ 400 0 \leq nums[i] \leq 400 0nums[i]400

解法一:记忆化搜索

我们定义 d f s ( i ) dfs(i) dfs(i) 为小偷 偷窃 前 i i i 个房间能够偷取的最大金额。

  • 偷第 i i i 个房间,能够偷取的最大金额为 d f s ( i − 2 ) + n u m s [ i ] dfs(i - 2) + nums[i] dfs(i2)+nums[i]
  • 不偷第 i i i 个房间,能够偷取的最大值为 d f s ( i − 1 ) dfs(i - 1) dfs(i1)

我们取二者的最大值,即 d f s ( i ) = m a x { d f s ( i − 2 ) + n u m s [ i ] , d f s ( i − 1 ) } dfs(i) = max \{ dfs(i - 2) + nums[i] , dfs(i - 1) \} dfs(i)=max{dfs(i2)+nums[i],dfs(i1)}

i < 0 i < 0 i<0 时, d f s ( i ) = 0 dfs(i) = 0 dfs(i)=0,表示没有房间可以偷了。

时间复杂度: O ( 1 ) O(1) O(1)

空间复杂度: O ( 1 ) O(1) O(1)

C++代码:

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();vector<int> f(n,-1);function<int(int)> dfs = [&](int i) ->int{if(i < 0) return 0;if(f[i] != -1) return f[i];int ans = max(dfs(i - 1) , dfs(i - 2) + nums[i]);f[i] = ans;return ans;};return dfs(n - 1);}
};

解法二:动态规划

我们将 记忆化搜索 一比一的翻译成 递推,即动态规划

  • d f s ( i ) = m a x { d f s ( i − 2 ) + n u m s [ i ] , d f s ( i − 1 ) } dfs(i) = max \{ dfs(i - 2) + nums[i] , dfs(i - 1) \} dfs(i)=max{dfs(i2)+nums[i],dfs(i1)}
  • f ( i ) = m a x { f ( i − 2 ) + n u m s [ i ] , f ( i − 1 ) } f(i) = max \{ f(i - 2) + nums[i] , f(i - 1)\} f(i)=max{f(i2)+nums[i],f(i1)}

i < 2 i < 2 i<2 时, i − 2 < 0 i - 2 < 0 i2<0 越界了,所以我们直接将其整体偏移两个单位,即最终的式子为:

f ( i + 2 ) = m a x { f ( i ) + n u m s [ i ] , f ( i + 1 ) } f(i + 2) = max \{ f(i) + nums[i] , f(i + 1)\} f(i+2)=max{f(i)+nums[i],f(i+1)}

最终返回的答案为 f ( n + 1 ) f(n + 1) f(n+1)

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

C++代码:

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();vector<int> f(n + 2,0);for(int i = 0;i < n;i++){f[i + 2] = max(f[i + 1],f[i] + nums[i]);}return f[n + 1];}
};

解法三:动态规划 + 变量

对于式子 :

f ( i + 2 ) = m a x { f ( i ) + n u m s [ i ] , f ( i + 1 ) } f(i + 2) = max \{ f(i) + nums[i] , f(i + 1)\} f(i+2)=max{f(i)+nums[i],f(i+1)}

我们发现 f ( i + 2 ) f(i + 2) f(i+2) 始终只与 f ( i ) f(i) f(i) f ( i + 1 ) f(i + 1) f(i+1) 有关, f ( i + 1 ) f(i + 1) f(i+1)前一个状态 f ( i ) f(i) f(i)前前一个状态

我们直接定义 f 1 f1 f1前一个状态,即 f ( i + 1 ) f(i + 1) f(i+1) f 0 f0 f0前前一个状态,即 f ( i ) f(i) f(i)

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1)

C++代码:

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();int f0 = 0 , f1 = 0;for(int i = 0;i < n;i++){int new_f = max(f1,f0 + nums[i]);f0 = f1;f1 = new_f;}return f1;}
};

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

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

相关文章

3+单基因泛癌+铜死亡纯生信思路

今天给同学们分享一篇3单基因泛癌铜死亡纯生信思路的生信文章“Systematic pan-cancer analysis identifies SLC31A1 as a biomarker in multiple tumor types”&#xff0c;这篇文章于2023年3月27日发表在BMC Med Genomics 期刊上&#xff0c;影响因子为3.622。 溶质载体家族3…

面试必杀技:Jmeter性能测试攻略大全(第一弹)

前言 性能测试是一个全栈工程师/架构师必会的技能之一&#xff0c;只有学会性能测试&#xff0c;才能根据得到的测试报告进行分析&#xff0c;找到系统性能的瓶颈所在&#xff0c;而这也是优化架构设计中重要的依据。 第一章 测试流程&#xff1a; 需求分析→环境搭建→测试…

【IDEA】idea恢复pom.xml文件显示灰色并带有删除线

通过idea打开spring boot项目后&#xff0c;发现每个服务中的pom.xml文件显示灰色并带有删除线&#xff0c;下面为解决方案 问题截图 解决方案 打开file——settings——build,execution,deployment——Ignored Files&#xff0c;把pom.xml前面的复选框去掉&#xff0c;去掉之…

IPV6知识总结

目录 一、IPV6与IPV4相比改进之处1. “无限“的地址空间2. 层次化的地址结构3. 即插即用4. 简化了报头头部5.保证端到端网络的完整性6.安全性增强7.增强QoS特性 二、IPV6的规则IPV6地址主要分为了三类&#xff1a;单播地址&#xff0c;组播地址&#xff0c;任播地址单播地址组播…

centos软件设置开机启动的方式

以下以redis作为案例&#xff1a; 开机启动方式一 [Unit] Descriptionredis-server Afternetwork.target [Service] Typeforking # 这里需要修改自己的配置文件 ExecStart/usr/local/bin/redis-server /etc/redis/redis.conf PrivateTmptrue [Install] WantedBymulti-user.tar…

Docker从认识到实践再到底层原理(七)|Docker存储卷

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

QT中获取类的属性和方法

目录 简介&#xff1a; 方法&#xff1a; 案例&#xff1a; 易犯错的地方&#xff1a; 简介&#xff1a; 在Qt中&#xff0c;要获取类的属性和方法&#xff0c;通常需要使用C的反射机制&#xff08;也称为元对象系统&#xff0c;Meta Object System&#xff0c;简称MOC&…

产品经理的职业前景怎么样?一文为你全面解答!

随着科技的迅速发展和市场竞争的日益激烈&#xff0c;产品经理这个职业变得越来越炙手可热。产品经理负责一款产品的全生命周期管理&#xff0c;从需求收集到设计、开发、测试、发布&#xff0c;再到市场推广和用户反馈&#xff0c;都需要产品经理参与决策。因此&#xff0c;这…

Android单编模块报FAILED: ninja: unknown target ‘MODULES-IN-vendor错误解决

有时我们需要单编Android AOSP一个APK或库文件或二进制&#xff0c;用来调试。 但可能这个模块本身是不参与系统整编编译的。我们在使用mmm或mm单独编译时就会报这个错误。 在检查Android.mk或Android.bp无误后&#xff0c;就要怀疑是不是这个目录的上级目录是不是没有包含这…

代码随想录 Day - 50|#123 买卖股票的最佳时机 III|#188 买卖股票的最佳时机 IV

清单 ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV LeetCode #123 买卖股票的最佳时机 III 1. 题目 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成两笔交易。 注意&am…

浅谈软件测试面试一些常见的问题

一、简历及岗位匹配度 说到简历&#xff0c;其实这一点是很重要但又被很多职场小白忽视的问题。经常有人说我投了很多简历&#xff0c;但是没有公司给我打电话&#xff0c;怎么办&#xff1f; 首先&#xff0c;应该明白的一点&#xff1a;面对求职市场的激烈竞争性&#xff0…

RFID技术引领汽车零部件加工新时代

RFID技术的兴起引领了汽车零部件加工领域的新时代&#xff0c;作为一种利用无线电频率进行自动识别的技术&#xff0c;RFID技术能够快速、准确地识别物体并获取相关数据&#xff0c;在汽车零部件加工中&#xff0c;RFID技术具有重要的应用价值&#xff0c;可以提高生产效率、降…

C++ Primer 类和对象(3)

类和结构体是比较相似&#xff0c;而传统的C的结构体中都是一些数据的类型&#xff0c;类除了有数据之外还有函数。所以可以把类想象成一个具有既有数据又有函数的复合数据类型。 类是一种将抽象转换为用户定义类型的C工具&#xff0c;它将数据表示和操纵数据的方法组合成一个整…

网络安全复习大纲wcf

单选10判断10填空30简答25分析25 选择 &#xff08;1&#xff09;计算机网络安全是指利用计算机网络管理控制和技术措施&#xff0c;保证在网络环境中数据的&#xff08; &#xff09;、完整性、网络服务可用性和可审查性受到保护。 A、保密性 B、抗攻击性 C、网络服务管理性 …

vite跨域proxy设置与开发、生产环境的接口配置,接口在生产环境下,还能使用proxy代理地址吗

文章目录 vite的proxy开发环境设置如果后端没有提供可以替换的/mis等可替换的后缀的处理办法接口如何区分.env.development开发和.env.production生产环境接口在生产环境下&#xff0c;还能使用proxy代理地址吗&#xff1f; vite的proxy开发环境设置 环境&#xff1a; vite 4…

如何使用virtualenv的虚拟环境

要使用virtualenv创建和管理虚拟环境&#xff0c;可以按照以下步骤&#xff1a; 安装virtualenv&#xff1a;如果你的系统上还没有安装virtualenv&#xff0c;可以使用以下命令安装&#xff1a; pip install virtualenv创建虚拟环境&#xff1a;在命令行中&#xff0c;进入你…

c++图像的边缘检测

图像的边缘检测 cv::Canny 是 OpenCV 中用于进行边缘检测的函数&#xff0c;特别是用于检测图像中的边缘。Canny 边缘检测是一种广泛使用的技术&#xff0c;它能够识别图像中的边缘&#xff0c;这些边缘通常表示对象之间的边界或图像中的显著特征 void cv::Canny(const cv::M…

网安新战场:CTF的那些事儿

CTF CTF的前世今生CTF竞赛中的挑战和难题CTF竞赛必备知识CTF竞赛中的技巧与策略&#xff1a; 写在末尾 主页传送门&#xff1a;&#x1f4c0; 传送 CTF的前世今生 CTF&#xff08;Capture The Flag&#xff09;是一种网络安全竞赛&#xff0c;旨在测试参与者解决各种网络安全问…

HTML中Input elements should have autocomplete attributes的解决方案

kwfwservice.php:1 [DOM] Input elements should have autocomplete attributes (suggested: “current-password”): (More info: https://goo.gl/9p2vKq) <input name"password" id"password" lay-verify"required" placeholder"密码&…

AI赋能的3D资产管理

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 想象一下&#xff0c;作为一名视频游戏设计师&#xff0c;你希望在游戏中使用 3D 龙模型。 以前&#xff0c;你可以通过两种方式执行此操作&#xff1a; 自己制作复杂的 3D 模型或从多个角度拍摄龙模型的照片。前往 3D 模…