leecode-198. 打家劫舍

75 阅读2分钟

前言

记录一下算法的学习

题目描述

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

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

示例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

解题思路

  • 根据题目可得,当只有一个房子的时候,只能偷一个
  • 当两个房子的时候,因为相邻,只能取其中最大的一个
  • 当三个房子的时候,
    • 可以取当前所在房子的前两个和当前房子相加作为最大值
    • 也可以取前一个房子作为最大值,
  • 当四个房子的时候,如果第四个房子要偷则重复3两步。如果不偷第四个房子,则是4 - 1的最大值
  • 得出一个公式 如果有n个房子则最大值为 Math.max(f(n - 2) + nums[n],f(n-1))

代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var rob = function (nums) {
    if (nums.length === 0) return 0
    let dp0 = 0
    let dp1 = nums[0]
    for (let i = 2; i <= nums.length; i++) {
        const dp2 = Math.max(dp0 + nums[i - 1], dp1)
        dp0 = dp1
        dp1 = dp2
    }
    return dp1
};

复杂度分析

  • 时间复杂度:需要遍历n长度所以时间复杂度为O(n)
  • 空间复杂度:使用滚动数组需要两个变量存储值所以为O(1)

最后

每天进步一点点