LeetCode 198—— 打家劫舍

阅读目录

    • [1. 题目](#1. 题目)
    • [2. 解题思路](#2. 解题思路)
    • [3. 代码实现](#3. 代码实现)

1. 题目

2. 解题思路

此题使用动态规划求解,假设 d p [ i ] [ 0 ] dp[i][0] dp[i][0] 代表不偷窃第 i i i 个房屋可以获得的最高金额,而 d p [ i ] [ 1 ] dp[i][1] dp[i][1] 代表偷窃第 i i i 个房屋可以获得的最高金额。那么转移方程为:

d p [ i + 1 ] [ 0 ] = m a x ( d p [ i ] [ 0 ] , d p [ i ] [ 1 ] ) dp[i+1][0] = max(dp[i][0], dp[i][1]) dp[i+1][0]=max(dp[i][0],dp[i][1])

不偷窃第 i + 1 i+1 i+1 个房屋时,第 i i i 个房屋可以偷也可以不偷,所以取二者的最大值。

d p [ i + 1 ] [ 1 ] = d p [ i ] [ 0 ] + n u m s [ i + 1 ] dp[i+1][1] = dp[i][0] + nums[i+1] dp[i+1][1]=dp[i][0]+nums[i+1]

要偷窃第 i + 1 i+1 i+1 个房屋的话,第 i i i 个房屋一定不可以偷,所以取前一个房间不偷窃可以获得的最大金额再加上当前房屋的价值。

由于 d p [ i + 1 ] dp[i+1] dp[i+1] 只和 d p [ i ] dp[i] dp[i] 有关系,所以,我们只需要两个状态值即可。

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

3. 代码实现

c 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int stole_value = 0;
        int not_stole_value = 0;
        int max_value = 0;
        for (int i = 0; i < nums.size(); ++i) {
            int temp = not_stole_value;
            not_stole_value = max(stole_value, not_stole_value);
            stole_value = temp + nums[i];
            max_value = max(max_value, stole_value);
        }
        return max_value;
    }
};
相关推荐
算法鑫探1 小时前
闰年判断:C语言实战解析
c语言·数据结构·算法·新人首发
WBluuue1 小时前
数据结构与算法:康托展开、约瑟夫环、完美洗牌
c++·算法
木子墨5162 小时前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
王老师青少年编程3 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:均分纸牌
c++·算法·编程·贪心·csp·信奥赛·均分纸牌
EQUINOX13 小时前
2026年码蹄杯 本科院校赛道&青少年挑战赛道提高组初赛(省赛)第一场,个人题解
算法
萝卜小白3 小时前
算法实习Day04-MinerU2.5-pro
人工智能·算法·机器学习
Liangwei Lin3 小时前
洛谷 P3133 [USACO16JAN] Radio Contact G
数据结构·算法
伟大的车尔尼3 小时前
搜索题目:地图分析
动态规划·广度优先搜索
weixin_513449963 小时前
PCA、SVD 、 ICP 、kd-tree算法的简单整理总结
c++·人工智能·学习·算法·机器人
code_pgf3 小时前
Qwen2.5-VL 算法解析
人工智能·深度学习·算法·transformer