打家劫舍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 ...
随机推荐
- bootstrap入门&栅格系统
一.概述 1. 概念: 一个前端开发的框架,Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JavaScript 的,它简洁灵活,使得 ...
- curl 设置超时时间
使用CURL时,有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间.连接超时时间用--connect-timeout参数来指定,数据传输的最大允许时间用-m参数来指定. curl -- ...
- fiddler自动生成jmeter测试脚本
概述 昨天我们在课堂上讲了如何通过fiddler抓包,单一接口可以复制到jmeter中进行接口测试,那么如果抓包获取了大量的接口,我们如何快速实现接口转换成jmx文件呢? 今天给大家介绍fiddler ...
- html上传文件限制、前端限制文件类型
<input id="file" type="file" accept=".xls,.xlsx" style="width: ...
- Kibana自动关联ES索引
原因: Kibana中关联ES索引需要手动操作,如果ES中索引较多(如每天生成),则工作量会比较大. 方法: 考虑使用Linux的cron定时器自动关联ES索引,原理是调用Kibana API接口自动 ...
- 【转】Android root检测方法总结
一 为什么要进行root检测?出于安全原因,我们的应用程序不建议在已经root的设备上运行,所以需要检测是否设备已经root,以提示用户若继续使用会存在风险. 二 root了会有什么风险?在Linux ...
- In Vitro model验证 | Harnessing single-cell genomics to improve the physiological fidelity of organoid-derived cell types
Transcriptional benchmarking of in vitro cells to in vivo with single-cell rna-seq - 简介 Harnessing s ...
- linux 下nc 命令的使用
linux 下nc 命令的使用 https://blog.51cto.com/samyubw/555247
- 【转发】SqlServer数据库表生成C# Model实体类SQL语句
已知现有表T1 通过运行下面的sql即可,先配置表名. declare @TableName sysname = 'T1' declare @Result varchar(max) = ' /// & ...
- mybatis查询mysql的datetime类型数据时间差了14小时
场景: 数据库字段: mybatis使用 now() 生成时间. 结果: 使用mybatis查询mysql中的数据时,所有时间都比数据库时间多了14小时,考虑了一下,初步判定是系统时区的问题.因为my ...