打家劫舍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 ...
随机推荐
- Pytest权威教程19-编写钩子(Hooks)方法函数
目录 编写钩子(Hooks)函数 钩子函数验证和执行 firstresult: 遇到第一个有效(非None)结果返回 hookwrapper:在其他钩子函数周围执行 钩子(Hooks)函数排序/调用示 ...
- Shell字符串截取(非常详细)
假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. 1 echo ${var#*//} 其中 var 是变量名,# 号是运算符, ...
- Appium入门脚本
没有用框架的代码实现登录功能: import time from selenium import webdriver # 创建字典 desired_caps = {} desired_caps['pl ...
- 深入分析Synchronized原理(阿里面试题)
还有一篇 讲解lock的实现原理,参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理以及如何 获取锁AQS算法 (百度-美团) 记得开始学习Java的时候,一遇到多线程 ...
- [Beta]Scrum Meeting#5
github 本次会议项目由PM召开,时间为5月10日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客整理文档 撰写博客整理文档 swoip 改进界面 改进界面 b ...
- RNN 权重共享
之前在几篇博客中说到了权重共享,但都觉得不够全面,这里做个专题,以后有新的理解都在此更新. 1. 减少运算只是锦上添花之前说到权重共享可以减少运算,是的,但这样说好像是可有可无,只是运算量大小的问题, ...
- Cassandra3在Centos7下启动失败解决办法
Centos7 安装Cassandra启动过程提示失败,查看结果如下所示: [root@xx ~]# systemctl status cassandra ● cassandra.service - ...
- C# 取得某月的最后一天和第一天
strDate="2019-03" DateTime Date = DateTime.Parse(strDate); //要取得月份的某一天第一天).Date.AddDays( - ...
- RabbitMQ的应用总结
RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准 ...
- 【SpringBoot】SpringBoot日志框架(四)
日志框架介绍 在开发过程中,我们经常使用到日志来进行排查问题,我们使用的日志框架都是由2部分组成(日志API + 日志实现) 日志API(及日志抽象层)有:SLF4j(Simple Logging F ...