使用动态规划,看第几间屋子是偷还是不偷,偷的话由之前的没偷的状态转移过来,不偷的话之前可能偷了也可能没偷。

class Solution:
    def rob(self, nums: List[int]) -> int:
        dp=[[0,0] for _ in range(len(nums))]
        dp[0][0]=0
        dp[0][1]=nums[0]
        for i in range(1,len(nums)):
            dp[i][0]=max(dp[i-1][0],dp[i-1][1])
            dp[i][1]=dp[i-1][0]+nums[i]
        return max(dp[len(nums)-1][1],dp[len(nums)-1][0])

空间优化,注意需要同步更新当前家的偷和没偷值,所以要先设定一个变量。

class Solution:
    def rob(self, nums: List[int]) -> int:

        norob=0
        rob=nums[0]
        for i in range(1,len(nums)):
            temp1=max(rob,norob)
            temp2=norob+nums[i]
            norob=temp1
            rob=temp2
        return max(norob,rob)

将状态看成前k个家庭的最大金额,来进行状态转移,要么是前k-1家的,要么是k-2家,然后偷了当前的。

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums)==1:
            return nums[0]
        if len(nums)==0:
            return 0
        dp=[0 for _ in range(len(nums))]
        dp[0]=nums[0]
        dp[1]=max(nums[0],nums[1])
        for i in range(2,len(nums)):
            dp[i]=max(dp[i-1],dp[i-2]+nums[i])

        return dp[len(nums)-1]