算法(TS):打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 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 <= numsi <= 400

解答

如果只有一个房间,则偷窃该房间能得到最大金额,如果只有两个房间,则偷金额最大的一个房间。由题可知不能偷连续两个房间,当房间数大于 2 时,有两个偷窃选项:

  1. 偷窃第 k 间房屋,那么就不能偷窃第 k−1 间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 k 间房屋的金额之和。
  2. 不偷窃第 k 间房屋,偷窃总金额为前 k−1间房屋的最高总金额。

在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 k 间房屋能偷窃到的最高总金额。假设 dpk 是前 k 个房间偷到的最大金额,则可以得到公式:dpk = max(dpk-2 + numsk, dpk-1)

ini 复制代码
function rob(nums: number[]): number {
    if(nums.length === 0) return 0
  	if(nums.length === 1) return nums[0]
  
    const bp:number[] = []
    bp[0] = nums[0]
    bp[1] = Math.max(nums[0],nums[1])
    for(let i = 2; i < nums.length; i++) {
        bp[i] = Math.max(bp[i-2]+nums[i],bp[i-1])
    }

    return bp[nums.length-1]
};

考虑到每间房屋的最高总金额只和该房屋的前两间房屋的最高总金额相关,因此可以使用两个变量在每个时刻只需要存储前两间房屋的最高总金额。

ini 复制代码
function rob(nums: number[]): number {
    let f0 = 0
    let f1 = 0
    for(let i = 0; i < nums.length; i++) {
        [f0,f1] = [f1,Math.max(f0+nums[i],f1)]
    }

    return f1
};

时间复杂度O(n),空间复杂度O(1)

相关推荐
启观川4 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸4 小时前
排序算法介绍
python·算法·排序算法
濮水大叔5 小时前
Cabloy 双引擎架构详解:Vona 与 Zova 是如何协作的
typescript·node.js·全栈
动词ing5 小时前
【题目练习】算法 组合总和||
算法
longlongzihan5 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
前端大斗师5 小时前
「大于 1000」把 1000 元那单也算进去了:我在 Vue3 订单页对了 10 句话
前端·人工智能·typescript·大模型·原力计划
专业程序开发源5 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
Logic1016 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi0116 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
极光通讯6 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法