算法(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)

相关推荐
HZZD_HZZD5 小时前
用电负荷聚类分析实战:基于`scikit-learn`的`K-Means`与`DBSCAN`双算法对比、`PCA`降维可视化与智能电表负荷画像全流程
算法·scikit-learn·kmeans
MIngYaaa5205 小时前
2026暑期牛客多校1 2026-7-17
数据结构·算法
wabs6665 小时前
关于图论【卡码网107.寻找存在的路线的思考】
数据结构·算法·图论
半兽先生5 小时前
大模型技术开发与应用——4.大模型提示词工程实战
人工智能·算法
wuminyu5 小时前
JUC组件逐层剥离与深度剖析
java·linux·c语言·jvm·c++·算法
hhzz6 小时前
机器学习-算法模型系列文章:07-SVM 一巴掌拍出来的超平面:SVM核函数选错,再干净的数据也救不了你
算法·机器学习·支持向量机
geovindu6 小时前
java: Gale-Shapley Algorithm
java·开发语言·后端·算法
TunerT_TQ6 小时前
GitHub深度工程评测:Cline 源码级工程评测|65k Star 开源AI编程助手的工程全景
typescript·开源·github·vs code·ai编程助手·开源供应链安全·静态源码审计
冻柠檬飞冰走茶6 小时前
PTA基础编程题目集 7-34 通讯录的录入与显示(C语言实现)
c语言·开发语言·数据结构·算法
zander2587 小时前
LeetCode 79. 单词搜索
算法·深度优先