算法【中等-LCR 213. 打家劫舍(二)】

52 阅读2分钟

Hello,大家好,我是disguiseFish,我已经摆烂很长一段时间啦,摆烂的日子过得快乐又飞快~不知不觉都一年多了!!

最近在卷算法,但其实我的逻辑思维能力偏弱以及我之前就没有刷过算法!!所以我决定,每天写一点算法提升自己的逻辑思维!接下来我会从简入深的顺序来卷算法,同时会把看过的算法记录在这个平台~ 共勉!!!

213. 打家劫舍(二)

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

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

示例 1:

输入: nums = [2,3,2]
输出: 3
解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

输入: nums = [1,2,3,1]
输出: 4
解释: 你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4

示例 3:

输入: nums = [1,2,3]
输出: 3

 

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

解决方案

思路:

image.png

我们可以直接沿用打家劫舍(一)的方法

// 打家劫舍(一)的方法
 var rob1 = function (nums) {
    let dq = [0]
    dq[0] = nums[0]
    if (nums.length === 1) return nums[0]
    dq[1] = Math.max(nums[0], nums[1])
    for (let index = 2; index < nums.length; index++) {
        dq[index] = Math.max(dq[index - 1], dq[index - 2] + nums[index])
    }
    return dq[dq.length - 1]
}

var rob = function (nums) {
    // 偷东西可以分三种情况偷
    // 1不偷头尾  2不偷头偷尾巴  3不偷尾巴偷头
    // 但我们发现 二和三都包含了一   所以只用算二和三取最大值即可
    
    // 特殊情况处理 slice不改变原数组切割数组
    if(nums.length === 1) return nums[0] 
    return Math.max(rob1(nums.slice(1)),rob1(nums.slice(0, -1)))
};