当前位置: 首页 > news >正文

LeetCode Hot100(68/100)——198. 打家劫舍

文章目录

    • 题目链接
    • 题目说明
      • 示例
    • 解题思路总览
    • 解法一:纯递归(回溯思想)
      • 原理
      • Java 代码
      • 复杂度分析
    • 解法二:记忆化递归(自顶向下 DP)
      • 原理
      • Java 代码
      • 复杂度分析
    • 解法三:动态规划数组(自底向上)
      • 原理
      • 状态转移流程图
      • Java 代码
      • 复杂度分析
    • 解法四:空间优化 DP(推荐)
      • 原理
      • 时序图(变量更新)
      • Java 代码
      • 复杂度分析
    • 示例推演(以 `[2,7,9,3,1]` 为例)
    • 各解法实现复杂度与性能对比

题目链接

https://leetcode.cn/problems/house-robber/description/?envType=study-plan-v2&envId=top-100-liked


题目说明

你是一个专业小偷,计划偷窃沿街的房屋。每间房内有一定金额nums[i]
相邻的房屋装有联动报警系统,如果同一晚偷了相邻两间房,就会触发报警。

请你返回在不触发报警的前提下,一晚能偷到的最高金额

示例

  • 输入:[1,2,3,1]
    输出:4
    解释:偷第 1 间(1)和第 3 间(3),总计 4。
  • 输入:[2,7,9,3,1]
    输出:12
    解释:偷第 1 间(2)、第 3 间(9)、第 5 间(1),总计 12。

解题思路总览

打家劫舍

本质

线性DP

每间房只有"偷/不偷"两种决策

状态定义

dp[i] = 前 i 间房的最高金额

状态转移

不偷第 i 间: dp[i-1]

偷第 i 间: dp[i-2] + nums[i]

取最大值

可选解法

纯递归(指数级)

记忆化递归

DP数组(自底向上)

空间优化DP(滚动变量)


解法一:纯递归(回溯思想)

原理

对于第i间房,有两种选择:

  1. 不偷它:去看i-1的最优解
  2. 偷它:那i-1不能偷,只能加上i-2的最优解

递归式:
f ( i ) = max ⁡ ( f ( i − 1 ) , f ( i − 2 ) + n u m s [ i ] ) f(i) = \max(f(i-1), f(i-2) + nums[i])f(i)=max(f(i1),f(i2)+nums[i])

Java 代码

classSolution{publicintrob(int[]nums){returndfs(nums,nums.length-1);}privateintdfs(int[]nums,inti){if(i<0)return0;if(i==0)returnnums[0];returnMath.max(dfs(nums,i-1),dfs(nums,i-2)+nums[i]);}}

复杂度分析

  • 时间复杂度:O(2^n)(大量重复子问题)
  • 空间复杂度:O(n)(递归栈)

该方法直观,但会超时,不推荐实际提交。


解法二:记忆化递归(自顶向下 DP)

原理

在纯递归的基础上,加一个memo[i]保存f(i),避免重复计算。

Java 代码

importjava.util.Arrays;classSolution{privateint[]memo;publicintrob(int[]nums){memo=newint[nums.length];Arrays.fill(memo,-1);returndfs(nums,nums.length-1);}privateintdfs(int[]nums,inti){if(i<0)return0;if(memo[i]!=-1)returnmemo[i];intans=Math.max(dfs(nums,i-1),dfs(nums,i-2)+nums[i]);memo[i]=ans;returnans;}}

复杂度分析

  • 时间复杂度:O(n)(每个状态只算一次)
  • 空间复杂度:O(n)(memo + 递归栈)

解法三:动态规划数组(自底向上)

原理

定义dp[i]:考虑前i+1间房(0~i)时的最高金额。
转移:

  • 不偷第i间:dp[i-1]
  • 偷第i间:dp[i-2] + nums[i]
  • 所以:
    dp[i] = max(dp[i-1], dp[i-2] + nums[i])

状态转移流程图

不偷

开始 i

是否偷第 i 间?

收益 = dp[i-1]

收益 = dp[i-2] + nums[i]

dp[i] = max(两者)

处理 i+1

Java 代码

classSolution{publicintrob(int[]nums){intn=nums.length;if(n==1)returnnums[0];int[]dp=newint[n];dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);for(inti=2;i<n;i++){dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);}returndp[n-1];}}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

解法四:空间优化 DP(推荐)

原理

观察到dp[i]只依赖dp[i-1]dp[i-2],无需整个数组。
用两个变量滚动维护:

  • prev2 = dp[i-2]
  • prev1 = dp[i-1]

每次更新:

  • cur = max(prev1, prev2 + nums[i])
  • 然后prev2 = prev1,prev1 = cur

时序图(变量更新)

curprev1prev2Loopcurprev1prev2Loopcur = max(prev1, prev2 + nums[i])prev2 <- prev1prev1 <- cur

Java 代码

classSolution{publicintrob(int[]nums){intprev2=0;// dp[i-2]intprev1=0;// dp[i-1]for(intx:nums){intcur=Math.max(prev1,prev2+x);prev2=prev1;prev1=cur;}returnprev1;}}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

示例推演(以[2,7,9,3,1]为例)

inums[i]选不偷(dp[i-1])选偷(dp[i-2]+nums[i])dp[i]
02--2
17277
2971111
33111011
41111212

最终答案:12


各解法实现复杂度与性能对比

解法核心思想时间复杂度空间复杂度实现复杂度性能表现适用场景
纯递归暴力枚举偷/不偷O(2^n)O(n)很差,易超时仅用于理解问题
记忆化递归递归 + 缓存子问题O(n)O(n)优秀喜欢递归写法时
DP数组自底向上填表O(n)O(n)优秀且稳定面试常规写法
空间优化DP滚动变量替代数组O(n)O(1)中偏低最优实战/提交推荐
http://www.jsqmd.com/news/490777/

相关文章:

  • 【LLM进阶-Agent】13.function call vs mcp vs skills
  • 2025_NIPS_EgoExoBench: A Benchmark for First- and Third-person View Video Understanding in MLLMs
  • 告别绘图软件!Paperxie AI 科研绘图:10 次免费额度,让理工科论文可视化一步到位
  • Tower I3C Host Adapter 使用范例 (20)
  • 【C++】左值引用、右值引用
  • CS二开之睡眠混淆(五)BeaconGate,UDRL,Sleepmask组合拳
  • AI新范式 02|拆解世界模型:它是如何理解物理规律的?
  • WebRTC QoS方法之NetEQ在流量卡弱网应用下失效
  • Java基础-1
  • 2025_NIPS_Scaling RL to Long Videos
  • 【Dv3Admin】FastCRUD MD编辑器操作
  • open claw安装在windows wsl中教程
  • HDOJ 课程例题记录
  • 第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案
  • openclaw+qwen(笔记,非教程)
  • 讲讲普通小轿车驾驶证报考流程及费用,西安哪家驾校好? - mypinpai
  • UE5C++Part2--几种常见的变量类型
  • 企业级RustDesk私有化部署:Docker Swarm集群方案与安全加固指南
  • (85页PPT)某著名企业贝因美IT规划咨询报告(附下载方式)
  • Simulink仿真漂移机理分析(二):相图分析
  • R轻松玩转Excel数据
  • 课程记录:Windows2
  • 高德地图混合部署实战:离线瓦片与在线API的智能切换策略
  • 西安国文驾校二轮摩托车考驾照口碑如何,值得推荐吗 - 工业品牌热点
  • 探讨专业的精密锻造公司,三邑锻造在全国排名第几? - 工业推荐榜
  • 【一篇即毕业系列】C++的引用从基础到通天
  • 仅剩72小时!生态环境部新发布的《污染预测模型R实现规范》(HJ 1308-2024)强制适配倒计时(含兼容性迁移速查表)
  • 2026 本科生论文工具盘点:9 款 AI 工具搞定初稿 / 绘图 / 排版 / AI 率
  • leetcode 1389. Create Target Array in the Given Order 按既定顺序创建目标数组-耗时100
  • 国内免费AI聊天网站大全:稳定直连与高效响应指南