每日一题:LeetCode-198. 打家劫舍
题使我快乐,满脸开心.jpg
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻
的房屋在同一晚上被小偷闯入,系统会自动报警
。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下
,一夜之内能够偷窃到的最高金额。
示例 1:
示例 2:
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 400
思路
一眼动态规划,这道题最大的收获是远超官方题解数据,哈哈哈,撒花撒花~
dp 数组含义:
dp[i][0]
、dp[i][1]
含义是不偷、偷第i
家的最大收获状态转移方程:
dp[i][0] = max(dp[i][0], dp[i][1])
dp[i][1] = max(dp[i][0] + nums[i], dp[i][1])
初始化:
dp[0][0] = 0
dp[0][1] = nums[0]
其实代码基本就出来了,但是这个虽然时间复杂度挺高,但是空间复杂度还是会很高的,所以来优化一下吧!
其实很容易发现,在状态转移方程里,偷不偷下一家的数据,只跟上一家的数据有关,那么这里就可以使用滚动数组
的思路来优化空间了:
只定义一个两个位置的数组,
dp[0]
代表不偷当前家的最大值,dp[1]
代表偷当前家的最大值
具体逻辑很类似,直接上代码,细节都在注释了
代码
版权声明: 本文为 InfoQ 作者【半亩房顶】的原创文章。
原文链接:【http://xie.infoq.cn/article/f9d6d218cc7debebd814d00f3】。文章转载请联系作者。
评论