Title

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

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

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

Solve

动态规划+滚动数组:

还是先从最简单的情况开始考虑:

  1. 如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额
  2. 如果只有两间房屋,由于两间房屋相邻,不能同时偷窃,因此选择其中金额较高的房屋,可以偷窃到最高总金额。
  3. 如果房屋数量大于两间,对于第i间房屋有两种选择:
    1. 偷窃第i间房屋,那么就不能偷窃第i-1间房屋,偷窃总金额为前i-2间房屋最高总金额+第i间房屋的金额
    2. 不偷窃第i间房屋,偷窃总金额为前i-1间房屋最高总金额

用dp[i]表示前i间房子能偷窃到的最高总金额,有如下状态转移方程:
dp[i]=max(dp[i−2]+nums[i],dp[i−1])dp[i]=max(dp[i−2]+nums[i],dp[i−1]) dp[i]=max(dp[i−2]+nums[i],dp[i−1])

边界条件为:dp[0]=nums[0],只有一间房屋则偷窃该房屋dp[0]=nums[0],只有一间房屋则偷窃该房屋dp[0]=nums[0],只有一间房屋则偷窃该房屋dp[1]=max(nums[0],nums[1]),两间房屋选择其中金额较高的偷窃dp[1]=max(nums[0],nums[1]),两间房屋选择其中金额较高的偷窃dp[1]=max(nums[0],nums[1]),两间房屋选择其中金额较高的偷窃

最终的答案即为 dp[n−1],其中 n 是数组的长度。

考虑到每间房屋的最高总金额只和该房屋的前两间房屋的最高总金额相关,因此可以使用滚动数组,在每个时刻只需要存储前两间房屋的最高总金额。

复杂度分析

时间复杂度:O(n),其中 n 是数组长度。只需要对数组遍历一次。

空间复杂度:O(1)。使用滚动数组,可以只存储前两间房屋的最高总金额,而不需要存储整个数组的结果,因此空间复杂度是 O(1)。

Code

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

198. House Robber相关推荐

  1. [dp]leetcode 198. House Robber

    输入:一个数组nums,每一个元素nums[i]表示第i个房间的价值. 输出:一个抢劫犯能抢到又不会被警察发现的最大价值. 规则:如果抢劫犯抢了相邻房间,那么报警装置就会触发,警察会得到通知. 分析: ...

  2. leetcode python3 简单题198. House Robber

    1.编辑器 我使用的是win10+vscode+leetcode+python3 环境配置参见我的博客: 链接 2.第一百九十八题 (1)题目 英文: You are a professional r ...

  3. 198. House Robber 的递归与动态规划实现方法(Python)

    目录 背景 实现方法 Step 1. 确定递归关系 Step 2. 递归方法实现 (top-down) Step 3. 递归方法 + 过程存储 实现 (top-down) Step 4. 迭代方法 + ...

  4. 198 House Robber

    题目链接:https://leetcode.com/problems/house-robber/ 题目: You are a professional robber planning to rob h ...

  5. 198. House Robber(入室强盗)

    标签(空格分隔): leetcode dp You are a professional robber planning to rob houses along a street. Each hous ...

  6. LeetCode 198 House Robber(强盗盗窃最大值)(动态规划)(*)

    翻译 你是一个专业强盗,并计划沿街去盗窃每一个住户.每个房子都有一定量的现金,阻止你盗窃的唯一阻碍是相邻的两个房子之间有安全系统.一旦这两个房子同时被盗窃,系统就会自动联系警察.给定一系列非负整数代表 ...

  7. 198. House Robber(动态规划--房屋强盗)

    题目 You are a professional robber planning to rob houses along a street. Each house has a certain amo ...

  8. leetcode解题报告:198 House Robber

    问题描述: 一个小偷去一个街区偷东西,求偷得价值最大,唯一限制就是不能偷连续的两家,因为这样会触发警报. 建模: 给定一个列表,里面存着每家可以偷的价值,输出最大偷到的价值. 思路:动态规划 如果输入 ...

  9. LeetCode 198 House Robber Python

    题意:一组直线排列的房屋,一个小偷要进屋偷钱,如果小偷偷了相邻两座房屋就会触发报警系统,问在不触发报警系统的前提下小偷最多可以偷到多少钱. 难度:esay 思路:这是一道标准的动态规划问题,创建一个l ...

最新文章

  1. 优秀!这些高校诞生一批 “80后”总裁!Top3均来自人工智的黄埔军校!
  2. ADF Jar包循环引用会出问题
  3. 4个mos管驱动的全桥电路原理_最经典MOS管电路工作原理及详解没有之一
  4. 风影ASP.NET基础教学 3 web服务器控件(二)
  5. 如何使用dll ip转换_如何使用多功能转换插座更安全
  6. (二分搜索法尺取法)subsequence
  7. kali的burpsuite笔记
  8. matlab矩阵的低秩分解,低秩分解的matlab代码看不懂,分解的两个矩阵在哪呀??...
  9. 驱动英特尔核显,让黑苹果流畅运行「OpenCore专门篇」
  10. 史上最强的融资方案商业计划书
  11. 领存Xeon E5 6U VPX高性能计算刀片
  12. 如何在微信分享的网页中显示描述和图片
  13. 又赚了!分享几个我常去的私活接单平台
  14. 单点登录(SSO)解决方案介绍
  15. 两端分散对齐怎么设置_Word文档两端对齐分散对齐有哪些设置方法
  16. 2021年好用的几款大数据分析工具
  17. Spring入门-1-基本配置和IOC、DI
  18. 「Python条件结构」银行存款
  19. idea上一步失效:Ctrl+Alt+左箭头 Ctrl+Alt+右箭头
  20. 阿里巴巴收购家装公司匠多多 持股20%

热门文章

  1. shell基础09 gawk程序(上)
  2. xlrd、xlwt操作execl表格
  3. *args,**kwargs的使用方法
  4. Linux常用命令和常见问题解决------第一章
  5. js判断中文字符长度
  6. 在Ubutun 14.04 Desktop LTS上部署Hadoop 2.7.1(伪分布式)
  7. 我的编程学习日志(1)--进制转换
  8. MVC中返回Json的几种声明方式
  9. oracle查询第二个字为a,Oracle多表查询 - osc_yqnlq679的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. Java黑皮书课后题第3章:3.14(游戏:猜硬币的正反面)编写程序,让用户猜一猜是硬币的正面还是反面。随即产生一个整数0或1,分别表示