LeetCode 198:打家劫舍(House Robber)—— 题解 ✅

LeetCode 198:打家劫舍(House Robber)------ 题解 ✅

📖 内容概要

你是一个专业的小偷,计划偷窃沿街的房屋。

每间房都有一定数量的现金,但相邻的房屋装有连通的防盗系统

如果两间相邻的房屋在同一晚上被闯入,系统会自动报警。

求在不触动警报的前提下,一夜之内能够偷窃到的最高金额

✅ 动态规划

✅ 线性 DP

✅ 面试高频题


💡 解题思路(核心)

一、状态定义

java 复制代码
dp[i] = 到第 i 间房子为止,能偷到的最大金额

二、状态转移方程(最重要)

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

选择 说明 金额
不偷 继承前一家的最大金额 dp[i-1]
加上前两家的金额 dp[i-2] + nums[i]
java 复制代码
dp[i] = max(dp[i-1], dp[i-2] + nums[i])

三、边界条件

情况 说明
只有一间房 只能偷这一间
有两间房 偷金额较大的那一间
java 复制代码
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);

✅ AC 代码(Java)

java 复制代码
class Solution {
    public int rob(int[] nums) {
        int len = nums.length;
        if (len == 1) {
            return nums[0];
        }

        int[] dp = new int[len];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);

        for (int i = 2; i < len; i++) {
            dp[i] = Math.max(
                dp[i - 1],          // 不偷当前房子
                dp[i - 2] + nums[i] // 偷当前房子
            );
        }
        return dp[len - 1];
    }
}

⏱️ 复杂度分析

指标 复杂度
时间复杂度 O(n)
空间复杂度 O(n)(可优化为 O(1))

🚀 空间优化(进阶)

由于 dp[i] 只依赖前两个状态:

java 复制代码
int prev2 = nums[0];
int prev1 = Math.max(nums[0], nums[1]);

for (int i = 2; i < nums.length; i++) {
    int curr = Math.max(prev1, prev2 + nums[i]);
    prev2 = prev1;
    prev1 = curr;
}
return prev1;

✅ 一句话总结

要么不偷当前房子,要么偷当前房子 + 前两间的最优解,取最大值。


📌 面试加分点(建议记住)

  • ✅ 为什么不能偷相邻房间?
  • ✅ 为什么是 dp[i-2] + nums[i] 而不是 dp[i-1] + nums[i]
  • ✅ 如何优化空间复杂度?
  • ✅ 与「打家劫舍 II(环形房屋)」的关系
相关推荐
圣保罗的大教堂9 小时前
leetcode 3867. 数对的最大公约数之和 中等
leetcode
To_OC11 小时前
LC 15 三数之和:双指针不难,难的是把去重做对
javascript·算法·leetcode
renhongxia114 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
G.O.G.O.G14 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)
数据库·sql·mysql·leetcode
zephyr0516 小时前
动态规划-最长上升子序列问题
算法·动态规划
闪电悠米16 小时前
力扣hot100-56.合并区间-排序详解
数据结构·算法·leetcode·贪心算法·排序算法
卡提西亚17 小时前
leetcode-1438. 绝对差不超过限制的最长连续子数组
算法·leetcode·职场和发展
Java面试题总结18 小时前
LeetCode 93.复原IP地址
算法·leetcode·职场和发展·.net
从零开始的代码生活_18 小时前
C++ 多态详解:虚函数、动态绑定、抽象类与虚表原理
开发语言·c++·后端·学习·算法
Tisfy19 小时前
LeetCode 3867.数对的最大公约数之和:按题目说的做(gcd)
算法·leetcode·题解·模拟·最大公约数·gcd