欢迎来到张胤尘的技术站
技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌
官方站点: 力扣 Leetcode
题目地址:打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 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 。
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 400
首先根据题意判断边界条件,当集合 nums
中元素数量为 1 时直接返回首个元素的值即可。
然后借助辅助变量 preNotRob
和 preRob
:
preNotRob
:前一天在不偷的情况下可以偷取的最大值,初始化为 0 表示第一家不偷取。preRob
:前一天偷的情况下可以偷取的最大值,初始化为 nums[0]
表示第一家偷取。紧接着,借助循环从第二家 i == 1
开始,针对 “偷” 和 “不偷” 两种情况处理:
curRob
就是前一家不偷的最大值 preNotRob
和当前值 nums[i]
的和。c u r R o b = p r e N o t R o b + n u m s [ i ] curRob = preNotRob + nums[i] curRob=preNotRob+nums[i]
curNotRob
就是前一家偷的最大值 preRob
和前一家不偷的最大值 preNotRob
的最大值。c u r N o t R o b = m a x ( p r e N o t R o b , p r e R o b ) curNotRob = max(preNotRob, preRob) curNotRob=max(preNotRob,preRob)
然后每次循环结束后,使用 curNotRob
和 curRob
更新 preNotRob
和 preRob
。
最后循环结束时,只需要判断 preNotRob
和 preRob
中的最大值即可。
c/c++
#include
class Solution
{
public:
int rob(std::vector<int> &nums)
{
int sz = nums.size();
if (sz == 1)
return nums[0];
int preNotRob = 0;
int preRob = nums[0];
for (int i = 1; i < sz; i++)
{
int curNotRob = std::max(preNotRob, preRob);
int curRob = preNotRob + nums[i];
preNotRob = curNotRob;
preRob = curRob;
}
return std::max(preNotRob, preRob);
}
};
golang
func rob(nums []int) int {
sz := len(nums)
if sz == 1 {
return nums[0]
}
preNotRob := 0
preRob := nums[0]
for i := 1; i < sz; i++ {
curNotRob := max(preRob, preNotRob)
curRob := preNotRob + nums[i]
preNotRob = curNotRob
preRob = curRob
}
return max(preNotRob, preRob)
}
lua
local function rob(nums)
local sz = #nums
if sz == 1 then
return nums[1]
end
local preNotRob = 0
local preRob = nums[1]
for i = 2, sz do
local curNotRob = math.max(preRob, preNotRob)
local curRob = preNotRob + nums[i]
preNotRob = curNotRob
preRob = curRob
end
return math.max(preNotRob, preRob)
end
撒花!
如果本文对你有帮助,就点关注或者留个
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。