198. 打家劫舍

解题思路

动态规划:(与面试题17.16按摩师属于同一题型)
定义 dp[i][0] 表示第i家不偷,dp[i][1]表示第i家偷。根据题意,相邻的房屋不能偷。
因此当第i家不偷时,第i-1家偷不偷都可以,则 dp[i][0] = max(dp[i-1][0], dp[i-1][1]);而当第i家偷的时候,第i-1家不能偷,则dp[i][1] = dp[i-1][0]+nums[i],最后返回max(dp[n][0], dp[n][1])即可。
复杂度分析:
时间复杂度:O(n),其中 n 为房屋个数。我们有 2n 个状态需要计算,每次状态转移需要 O(1) 的时间,所以一共需要 O(2n)=O(n) 的时间复杂度。
空间复杂度:O(1),只需要常数的空间存放若干变量。

代码

class Solution:
    def rob(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 0:
            return 0
        dp0 = 0 # 第一家不偷
        dp1 = nums[0] # 第一家偷
        for i in range(1, n): # 从第二家开始
            tdp0 = max(dp0, dp1) # 第i家不偷,那么第i-1家可以偷也可以不偷,取最大值
            tdp1 = dp0 + nums[i] # 第i家偷,那么第i-1家不可以偷
            dp0 = tdp0
            dp1 = tdp1
        return max(dp0, dp1)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 思路 标签:动态规划 动态规划方程:dp[n] = MAX( dp[n-1], dp[n-2] + num ) 由...
    cronaldo5352阅读 176评论 0 0
  • 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋...
    或无言阅读 220评论 0 0
  • 题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房...
    小刘一定要努力阅读 122评论 0 0
  • 题目 难度:★★☆☆☆类型:数学 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯...
    玖月晴阅读 1,012评论 0 0
  • 原题链接:https://leetcode-cn.com/problems/house-robber/ 题目: 你...
    IgorNi阅读 244评论 0 0