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;
    }
};
相关推荐
Yingye Zhu(HPXXZYY)3 小时前
ICPC 2023 Nanjing R L 题 Elevator
算法
阿维的博客日记5 小时前
LeetCode 139. 单词拆分 - 动态规划解法详解
leetcode·动态规划·代理模式
程序员Xu6 小时前
【LeetCode热题100道笔记】二叉树的右视图
笔记·算法·leetcode
笑脸惹桃花6 小时前
50系显卡训练深度学习YOLO等算法报错的解决方法
深度学习·算法·yolo·torch·cuda
阿维的博客日记7 小时前
LeetCode 48 - 旋转图像算法详解(全网最优雅的Java算法
算法·leetcode
GEO_YScsn7 小时前
Rust 的生命周期与借用检查:安全性深度保障的基石
网络·算法
程序员Xu7 小时前
【LeetCode热题100道笔记】二叉搜索树中第 K 小的元素
笔记·算法·leetcode
THMAIL8 小时前
机器学习从入门到精通 - 数据预处理实战秘籍:清洗、转换与特征工程入门
人工智能·python·算法·机器学习·数据挖掘·逻辑回归
Kevinhbr8 小时前
CSP-J/S IS COMING
数据结构·c++·算法
蕓晨9 小时前
set的插入和pair的用法
c++·算法