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;
    }
};
相关推荐
南宫生7 分钟前
力扣每日一题【算法学习day.130】
java·学习·算法·leetcode
柠石榴8 分钟前
【练习】【类似于子集问题】力扣491. 非递减子序列/递增子序列
c++·算法·leetcode·回溯
干饭高手12 分钟前
Day9,Hot100(图论)
python·leetcode·图论
!!!52516 分钟前
Java实现斗地主-做牌以及对牌排序
java·算法
sjsjs1122 分钟前
【数据结构-并查集】力扣1722. 执行交换操作后的最小汉明距离
数据结构·算法·leetcode
CoderIsArt34 分钟前
生成一个立方体贴图(Cube Map)
算法·sharpgl
且听风吟ayan41 分钟前
leetcode day20 滑动窗口209+904
算法·leetcode·c#
m0_6759882341 分钟前
Leetcode350:两个数组的交集 II
算法·leetcode·数组·哈希表·python3
_Itachi__42 分钟前
LeetCode 热题 100 160. 相交链表
算法·leetcode·链表
m0_675988231 小时前
Leetcode1206:设计跳表
算法·leetcode·跳表·python3