打家劫舍I
题目描述(LeetCode)
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例 1:
输入: [,,,]
输出:
解释: 偷窃 号房屋 (金额 = ) ,然后偷窃 号房屋 (金额 = )。
偷窃到的最高金额 = + = 。
示例 2:
输入: [,,,,]
输出:
解释: 偷窃 号房屋 (金额 = ), 偷窃 号房屋 (金额 = ),接着偷窃 号房屋 (金额 = )。
偷窃到的最高金额 = + + = 。
题目讲解
很多人拿到上面的意思,可能还是没有理解透彻,讲解一下思路:
- 标签: 动态规划
- 动态规划方程:
dp[n] = MAX( dp[n-1], dp[n-2] + num ) - 由于不可以在相邻的房屋闯入,所以在当前位置n房屋可盗窃的最大值,要么就是
n-1房屋可盗窃的最大值,要么就是n-2房屋可盗窃的最大值加上当前房屋的值,二者之间取最大值 - 举例说明: 1号房间可盗窃的最大值为3,即为dp[1] = 3, 2号房间可盗窃最大值为4,即为dp[2] = 4, 3号公寓自身为2,即为num=2,那么
dp[3] = MAX( dp[2], dp[1] + num ) = MAX(4, 3+2) = 5,3 号房间可盗窃最大值为 5 - 时间复杂度为: O(n), n为数组长度
下面我们通过图解,通过例子[3,1,2,4]来讲解:
2.1
上面代表是举出例子,3,1,2,4,下面的代表是dp函数,也就是前面相加之和记为dp
开始dp[0] = 0,dp[1] = num[0]= 3

1/5
2.2
dp[0] = 0, dp[1] = 3, dp[i] = MAX(dp[i - 1], dp[i - 2] + num[i - 1] )---->dp[0],是从0开始
dp[2] = MAX(dp[1], dp[0] + num[i]) = MAX(3, 0 + 1) = 3
所以dp[2] = 3
2.3
dp[0] = 0, dp[1] = 3, dp[i] = MAX(dp[i - 1], dp[i - 2] + num[i - 1] )---->dp[0],是从0开始
dp[3] = MAX(dp[2], dp[1] + num[2]) = MAX(3, 3 + 2) = 5
所以dp[3] = 5

2.4
dp[0] = 0, dp[1] = 3, dp[i] = MAX(dp[i - 1], dp[i - 2] + num[i - 1] )---->dp[0],是从0开始
dp[4] = MAX(dp[3], dp[2] + num[3]) = MAX(5, 3 + 4) = 7
所以dp[4] = 7

题目代码
(1)针对上面的思路分析,下面是java 代码
class Solution {
public int rob(int[] nums) {
int len = nums.length;
if(len == )
return ;
int[] dp = new int[len + ];
dp[] = ;
dp[] = nums[];
for(int i = ; i <= len; i++) {
dp[i] = Math.max(dp[i-], dp[i-] + nums[i-]);
}
return dp[len];
}
}
(2)swift代码如下(可在playground直接运行)
let numsArr: [Int] = [,,,]
var newNumArr = [Int]()
func robs(numArr: [Int]) -> Int {
if numArr.count == {
return
}
//newNumArr[0] = 0这种写法是错误的,swift数组不允许直接赋值,会造成两个数组同时操作同一块地址空间
newNumArr.append(0)
newNumArr.append(numArr[0])
var fk_1 =
var fk_2 =
for i in ..<(numArr.count + ) {
fk_1 = newNumArr[i - ]
fk_2 = newNumArr[i - ] + numArr[i - ]
let temp = fk_1 > fk_2 ? fk_1 : fk_2
newNumArr.append(temp)
}
return newNumArr[numArr.count] }
let maxRob = robs(numArr: numsArr)
print(maxRob)
输出结果是7,和上面一样!
上面是打家劫舍的第一版本,后续我们将继续出版其他版本的打家劫舍,欢迎大家关注,谢谢
打家劫舍I的更多相关文章
- (leetcode:选择不相邻元素,求和最大问题):打家劫舍(DP:198/213/337)
题型:从数组中选择不相邻元素,求和最大 (1)对于数组中的每个元素,都存在两种可能性:(1)选择(2)不选择,所以对于这类问题,暴力方法(递归思路)的时间复杂度为:O(2^n): (2)递归思路中往往 ...
- leetcode 198 打家劫舍 Python 动态规划
打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定 ...
- 213 House Robber II 打家劫舍 II
注意事项: 这是 打家劫舍 的延伸.在上次盗窃完一条街道之后,窃贼又转到了一个新的地方,这样他就不会引起太多注意.这一次,这个地方的所有房屋都围成一圈.这意味着第一个房子是最后一个是紧挨着的.同时,这 ...
- Leetcode337. 打家劫舍 III
Leetcode 337. 打家劫舍 III 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根". 除了"根& ...
- 【LeetCode】198. 打家劫舍
打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定 ...
- 打家劫舍II
题目描述(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的 ...
- [LeetCode] 198. 打家劫舍II ☆☆☆(动态规划)
描述 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的 ...
- [LeetCode] 198. 打家劫舍 ☆(动态规划)
描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个 ...
- [LeetCode] 213. House Robber II 打家劫舍 II
Note: This is an extension of House Robber. After robbing those houses on that street, the thief has ...
随机推荐
- flag&to do list¬e
没错,今天我要立几个看起来可能会倒的 flag 今天白天 早上除非有特殊情况,不许再看我的博客.不许再看我的qq空间.不许再跟别人聊闲话!!!☑已达成 今天早上一定要坚持做题,把昨天问老师的问题搞懂, ...
- Android Studio 点运行启用时,列表中不显示虚拟机,但是实际上在AVD Manager中已经添加了2个虚拟设备了
Android Studio 点运行启用时,列表中不显示虚拟机,但是实际上在AVD Manager中已经添加了2个虚拟设备了 百度上找了一下方法, 情况出现:打开androidstudio,一直连接不 ...
- srs安装与ffmpeg推流
环境说明:ubuntu 16.04 当前目录为~/. 一. 下载 git clone https://github.com/ossrs/srs.git 二.部署SRS 关闭防火墙,执行如下命令. uf ...
- hg19基因组 | 功能区域 | 位置提取
如何获取hg19的CDS.UTR.intergenic.intron等的位置信息? 参考手册: Hg19 regions for Intergenic, Promoters, Enhancer, Ex ...
- python skimage图像处理(一)
python skimage图像处理(一) This blog is from: https://www.jianshu.com/p/f2e88197e81d 基于python脚本语言开发的数字图片处 ...
- Oracle的“ORA-00937: 不是单组分组函数” 如何解决?
之前在编写oracle的sql语句时遇到这个问题,这里做个记录 问题描述:ORA-00937: 不是单组分组函数 问题原因:select语句中又在查询某一列的值,其中还有聚合函数 原先本人编写SQL是 ...
- Swift5升级遇到的AVCapturexxxDelegate的坑,写法换了
升级到swift5之后,遇到关于AVCapture的两个代理都失效了, 找了一圈,发现原因是代理方法写法变了,如果不替换,代理事件就收不到了 解决方法: 替换新写法就可以了 我这边只举例我遇到的两个例 ...
- t5_sumdoc.txt
C:\Users\Administrator\Documents\sumdoc 2019\sumdoc t5 final\sumdoc t511C:\Users\Administrator\Docum ...
- odoo开发笔记 -- 还原数据库后,异常:ir_attachment: IOError: [Errno 2] No such file or directory: u'/var/...'
场景描述: 恢复Odoo数据后,抛出错误导致无法进入页面 -- ::, INFO aeo odoo.addons.base.ir.ir_attachment: _read_file reading / ...
- django中安全sql注入等
模拟sql注入 使用原生sql语句编写login登录逻辑 class LoginUnsafeView(View): def get(self, request): return render(requ ...