LeetCode-198. 打家劫舍【数组 动态规划】

LeetCode-198. 打家劫舍【数组 动态规划】

  • 题目描述:
  • 解题思路一:Python动态规划五部曲:定推初遍举
  • 解题思路二:优化空间
  • 解题思路三:0

题目描述:

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

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

示例 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 <= nums.length <= 100
0 <= nums[i] <= 400

解题思路一:Python动态规划五部曲:定推初遍举

  1. 确定dp数组(dp table)以及下标的含义
    dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。

  2. 确定递推公式
    决定dp[i]的因素就是第i房间偷还是不偷。

如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。

如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,(注意这里是考虑,并不是一定要偷i-1房,这是很多同学容易混淆的点)

然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);

  1. dp数组如何初始化
    从递推公式dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);可以看出,递推公式的基础就是dp[0] 和 dp[1]

从dp[i]的定义上来讲,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);

  1. 确定遍历顺序
    dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是从前到后遍历!

  2. 举例推导dp数组
    以示例二,输入[2,7,9,3,1]为例。
    在这里插入图片描述

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums) == 0:
            return 0
        if len(nums) == 1:
            return nums[0]
        dp = [0] * len(nums)
        dp[0], dp[1] = nums[0], max(nums[0], nums[1])
        for i in range(2, len(nums)):
            dp[i] = max(dp[i-2] + nums[i], dp[i-1])
        return dp[-1]

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

解题思路二:优化空间

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums) == 0:
            return 0
        if len(nums) == 1:
            return nums[0]
        dp = [0, 0]
        dp[0], dp[1] = nums[0], max(nums[0], nums[1])
        for i in range(2, len(nums)):
            cur = max(dp[0] + nums[i], dp[1])
            dp[0], dp[1] = dp[1], cur
        return dp[1]

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

解题思路三:0


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

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

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

相关文章

靠谱设计培训之路,辽宁梵宁教育与你同行

在快速发展的现代社会&#xff0c;设计行业日益繁荣&#xff0c;成为许多年轻人追逐梦想的舞台。然而&#xff0c;想要在设计领域脱颖而出&#xff0c;仅凭一腔热血是远远不够的&#xff0c;专业的培训和系统的学习才是通往成功的必经之路。辽宁梵宁教育&#xff0c;以其靠谱的…

OSPF防环文档

OPSF在区域内会产生俩类LSA&#xff1a;Router LSA &#xff0c;Network LSA 路由器以自己为树根构建最短路径树 &#xff0c;这里的最短路径树按两步形 成&#xff0c;第一步&#xff0c;仅考虑路由器和传输网络之间的连接。通过 Dijkstra 算法&#xff0c;根据链路状态数据…

基于知识图谱的推理:智能决策与自动发现

基于知识图谱的推理&#xff1a;智能决策与自动发现 一、引言 在今天这个数据驱动的时代&#xff0c;我们经常会听到人们提及“知识图谱”这个词。知识图谱&#xff0c;作为一种结构化知识的表达方式&#xff0c;已经成为智能系统不可或缺的一部分&#xff0c;它通过连接大量的…

App Inventor 2 SQLite 拓展

SQLite 拓展 此SQLite 拓展由中文网开发及维护&#xff0c;与 TaifunSQLite 功能类似&#xff0c;但TaifunSQLite是收费的&#xff0c;美刀。 文档及拓展下载地址&#xff1a; App Inventor 2 SQLite 拓展&#xff1a;超流行兼容主流SQL语法的迷你本地数据库引擎 App Invento…

【数据结构与算法篇】单链表及相关OJ算法题

【数据结构与算法篇】单链表及相关OJ算法题 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. 单链表的实现(近300行实现代码) 1.1 SList.h 头文件的声明 1.2 SLi…

码蹄集部分题目(第五弹;OJ赛2024年第10期)

&#x1f40b;&#x1f40b;&#x1f40b;竹鼠通讯&#xff08;钻石&#xff1b;分治思想&#xff1b;模板题&#xff1a;就算几何平面点对问题&#xff09; 时间限制&#xff1a;3秒 占用内存&#xff1a;128M &#x1f41f;题目描述 在真空中&#xff0c;一块无限平坦光滑…

Java毕业设计 基于SpringBoot vue流浪动物救助网站

Java毕业设计 基于SpringBoot vue流浪动物救助网站 SpringBoot 流浪动物救助网站 功能介绍 首页 图片轮播 动物领养/捐赠 留言 论坛 发布帖子 公告信息 商品信息 添加购物车 立即购买 寻宠请求 购物车 注册登录 个人中心 余额充值 收货地址 动物收藏 动物领养审核 商品订单 …

最简洁的Docker环境配置

Docker环境配置 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Mac、Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不…

基于Java+SpringBoot+Vue美容院业务管理系统(源码+文档+部署+讲解)

一.系统概述 悦己美容院后台管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比…

100道面试必会算法-20-全排列

100道面试必会算法-20-全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#…

Vue的模块化开发初探

文章目录 Vue的模块化开发初探一 概述二 步骤2.1 下载必须模块2.2 安装Live Server插件2.3 编写代码2.4 运行结果 三 总结四 参考资料 Vue的模块化开发初探 一 概述 Vue是一个渐进式JavaScript框架&#xff0c;可以按需引入部分功能&#xff0c;而不必全量引入整个框架。 二…

20240324-1-集成学习面试题EnsembleLearning

集成学习面试题 1. 什么是集成学习算法&#xff1f; 集成学习算法是一种优化手段或者策略&#xff0c;将多个较弱的模型集成模型组&#xff0c;一般的弱分类器可以是决策树&#xff0c;SVM&#xff0c;KNN等构成。其中的模型可以单独进行训练&#xff0c;并且它们的预测能以某…

python安装(window环境)

1.下载安装文件 首先推荐去官网下载最新版本&#xff0c;但是我这边官网打开很慢&#xff0c;而且下载的时候也很慢&#xff0c;翻墙也不行。所以我最终选择了非官方下载。 官网&#xff1a;Download Python | Python.org 中文官网&#xff1a;Python下载 | Python中文网 官…

牛客周赛39 --- G -- 小红不想做平衡树 -- 题解

小红不想做平衡树&#xff1a; 思路解析&#xff1a; 好数组的定义为 恰好翻转一个区间是得&#xff0c;这个区间变为升序的。 那么就有五种情况&#xff1a; 1.本身数组就升序的&#xff0c; 翻转一个长度为1的区间后&#xff0c;数组仍为升序 2.本身数组就降序的&#xf…

跨框架探索:React Redux 和 Vuex 对比分析快速掌握React Redux

React Redux 和 Vuex 都是前端状态管理库&#xff0c;分别用于 React 和 Vue.js 框架。 它们都提供了一套规范的状态管理机制&#xff0c;帮助开发者更好地组织和管理应用状态。下面是它们的一些异同点&#xff1a; 相同点&#xff1a; 中心化状态管理&#xff1a;两者都提…

环形链表 II - LeetCode 热题 26

大家好&#xff01;我是曾续缘&#x1f61b; 今天是《LeetCode 热题 100》系列 发车第 26 天 链表第 5 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 环形链表 II 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xf…

docker部署coredns服务器

创建文件夹 mkdir /coredns/config/添加一个CoreDNS配置文件 cat >/coredns/config/Corefile<<EOF.:53 {forward . 114.114.114.114:53log}EOF启动docker docker run -d --name coredns --restartalways \-v /coredns/config:/etc/coredns \-p 53:53/udp \regist…

HarmonyOS 开发-短视频切换实现案例

介绍 短视频切换在应用开发中是一种常见场景&#xff0c;上下滑动可以切换视频&#xff0c;十分方便。本模块基于Swiper组件和Video组件实现短视频切换功能。 效果图预览 使用说明 上下滑动可以切换视频。点击屏幕暂停视频&#xff0c;再次点击继续播放。 实现思路 使用Sw…

一文了解ERC404协议

一、ERC404基础讲解 1、什么是ERC404协议 ERC404协议是一种实验性的、混合的ERC20/ERC721实现的&#xff0c;具有原生流动性和碎片化的协议。即该协议可让NFT像代币一样进行拆分交易。是一个图币的互换协议。具有原生流动性和碎片化的协议。 这意味着通过 ERC404 协议&#xf…

混淆时,编译器优化导致通过反射赋值的类被清空问题

有几个反射赋值的类&#xff0c;之前一直是 keep 整个class的&#xff0c;现在要求对class的路径进行混淆。 当我启用混淆后&#xff0c;发现整个类的内容被清空了。 // 原始的类内容public class BaseLoadData {property("config_data1")public static String dat…