【五分钟力扣】198题—用python3解决打家劫舍问题
文章目录
- 一、前言
- 二、题目
- 三、解答思路
- 四、相关知识点
- 4.1 动态规划算法思想
- 五、代码实例
一、前言
每天五分钟,看懂一道简单、中等难度的算法题
疯狂学习python中,每天持续更新
书山有路勤为径,学海无涯苦作舟;与君初相识,犹如故人归。
二、题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例一:
输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。
实例二:
输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/house-robber
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
三、解答思路
判断条件:
当房间数为 H = 1 时:偷盗 K 房间即可获得最大收益 ,公式为: S1 = H1
当房间数为 H = 2 时: S2 =max( S1 ,H2)
当房间数为 H= 3时:S3 = max(s1+H3 , s2)
当房间数为 H =4 时:S4=max(S2+H4,S3)
递推公式:
Sn=max(Sn−1,Sn−2+Hn)S~n~ = max(S~n-1~,S~n-2~+Hn) S n =max(S n−1 ,S n−2 +Hn)
边界条件:
S1=H1S~1~ = H~1~ S 1 =H 1
S2=max(S1,H2)S~2~ = max(S~1~,H~2~) S 2 =max(S 1 ,H 2 )
注:当房间数为0时,条件不成立。
四、相关知识点
4.1 动态规划算法思想
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。
例子:
一个原始问题,可以分为多个子问题,多个子问题结果可能是重复的,为了方便调用,便于计算,它会保存已有结果,再遇到相同的子问题直接调用保存的结果。
相同子问题怎么产生的?
解:我们先求F(5)的解,如下,以二叉树的结构表示
通过二叉树,我们注意到,F(n)是通过计算它的两个重叠子问题 F(n-1)和F(n-2)的形式来表达的,所以,可以设计一张表填入n+1个F(n)的值。通过下面的表会发现:后一个数等于前面两个数的和。(这就是著名的斐波那契数)
五、代码实例
"""
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 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 。"""
from typing import Listnums = [2, 11, 18, 15, 1]class Solution:def rob(self, nums: List[int]) -> int:if not nums: # 如果房间数为空,则收益为0return 0if len(nums) == 1: # 只有一间房,这就是最大收益return nums[0]dp = [0, 0] # n必须大于2,套用公式计算的话,会超出索引范围,假设增加两个空房间,来进行对比dp.extend(nums) # 列表相加,得到[0, 0 ,2, 11, 18, 15, 1]for i in range(2, len(dp)):# dp[i] 也可以看出前几个房间的收益,最后一个房间收益是前面累计的和。dp[i] = max(dp[i-1], dp[i-2]+dp[i]) return dp[-1] # 取列表最后一个值if __name__ == '__main__':obj = Solution()print(obj.rob(nums))
总结分析:
"""
dp[i] 也可以看做是账本,记录着前几个房间盗窃的收益通过循环看到账本每次变动情况,直观了解项目运行过程[0, 0, 2, 11, 18, 15, 1]
[0, 0, 2, 11, 18, 15, 1]
[0, 0, 2, 11, 20, 15, 1]
[0, 0, 2, 11, 20, 26, 1]
[0, 0, 2, 11, 20, 26, 26]也就是最后一次账本记录的收益,是前几次盗窃的总值"""
【五分钟力扣】198题—用python3解决打家劫舍问题相关推荐
- 力扣刷题记录--哈希表相关题目
当遇到需要快速判断一个元素是否出现在集合里面的时候,可以考虑哈希法,牺牲一定的空间换取查找的时间. java常用的哈希表有HashMap.HashSet以及用数组去模拟哈希,这几种方法各有优劣. 数组 ...
- 力扣刷题记录-动态规划问题总结
百度百科里对于动态规划问题是这样解释的: 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.因此各个阶段 ...
- 教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!
开篇先致歉 其他不谈,开篇必须先给各位读者道个歉,年后工作上比较忙,加上最近闲暇的时间都用来在力扣上刷算法题了,导致公众号断更有些严重啊.再加上年后将健身减重提上了日程,时间上就更显的捉襟见肘了. 不 ...
- 数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树
将有序数组转换为二叉搜索树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总 ...
- 《剑指Offer》力扣刷题笔记(03-10)
<剑指Offer>力扣刷题笔记(03-10) 最近确实有点闲,想在进组搬砖之前找点有意义的事干,于是,就开始刷<剑指Offer>.<程序员面试金典>等书上的题目,也 ...
- 买卖股票的最佳时机——力扣121题
买卖股票的最佳时机--力扣121题 暴力解法 从前往后,不断将元素之间进行两两比较(类似冒泡排序中),然后不断更新出maxProfit的值.例如数组[7,1,5,3,6,4]中,从7开始,则7 -&g ...
- 力扣编程题-解法汇总
一.力扣链接: 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 备注:以后每个工作日从前往后刷一道题,然后再加一道每日新题.每天两道题. 二.模版: 标题: 力扣解法汇总5-正则表达 ...
- 力扣417题太平洋大西洋水流问题
力扣417题太平洋大西洋水流问题 题目描述:有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻. "太平洋" 处于大陆的左边界和上边界,而 "大西洋" ...
- 力扣刷题之二叉树的层序遍历
Welcome to you, 每日一刷系列 二叉树的层序遍历 二叉树的层序遍历II 二叉树的右视图 ...
- 程序员面试需要刷力扣算法题吗
这里写目录标题 1. 程序员面试需要刷力扣算法题吗 1.1. 算法题的一些特征 1.2. 为什么要考查算法 1.3. 目前面试主要考查 3 类 1. 程序员面试需要刷力扣算法题吗 1.1. 算法题的一 ...
最新文章
- 反对网抄,没有规则可以创建目标install 靠谱解答
- 哈希运算python实现_一致性哈希算法 python实现
- pycharm运行模型时怎么设置权重?_使用AMP和Tensor Cores得到更快速,更节省内存的PyTorch模型...
- 依赖注入[2]: 基于IoC的设计模式
- 为什么有的人开车舍不得开空调?车载空调耗油吗?
- java架构《并发线程中级篇》
- c语言程序设计第五版李丽娟_c语言程序设计第五版习题答案解析
- Symbian 项目
- python搭建一个后端平台
- Python大数据分析(三):大数据统计分析技术
- GISer开发者的技能清单
- java apache类库_java-类库-Apache Commons补充
- SAP 业务交易事件BTE(Business Transaction Event)
- git下载子模块命令git clone --recursive和git submodule update --init
- SEA创建、网卡聚合
- Windows驱动_文件系统微小过滤驱动之三微小过滤驱动的操作
- 【TIFF】一.TIFF 格式详解
- 肖特基二极管和快恢复二极管区别
- 静态中国风PPT模板
- Android 使用Nexus搭建本地私有Maven仓库