算法每日一练 (17)

欢迎来到张胤尘的技术站
技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌

文章目录

  • 算法每日一练 (17)
    • 打家劫舍
      • 题目描述
      • 解题思路
      • 解题代码
        • `c/c++`
        • `golang`
        • `lua`

官方站点: 力扣 Leetcode

算法每日一练 (17)

打家劫舍

题目地址:打家劫舍

题目描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 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 时直接返回首个元素的值即可。

  • 然后借助辅助变量 preNotRobpreRob

    • 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)

  • 然后每次循环结束后,使用 curNotRobcurRob 更新 preNotRobpreRob

  • 最后循环结束时,只需要判断 preNotRobpreRob 中的最大值即可。

解题代码

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

撒花!

如果本文对你有帮助,就点关注或者留个
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述

你可能感兴趣的:(算法每日一练,算法,数据结构)