码迷,mamicode.com
首页 > 其他好文 > 详细

198. House Robber

时间:2018-10-05 21:55:06      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:变量   用两个   lin   inline   turn   数组   金钱   mat   inpu   

问题

非负数组表示每个房子拥有的金钱,抢了一个房子后不能抢隔壁房子的,求能抢到的最大数额。

Input: [1,2,3,1]
Output: 4
Explanation: 1 + 3 = 4.

思路

用dp[i]表示以index i结尾的子数组里,能抢的金钱最大和(不一定要抢nums[i])。可以得到dp公式为:\(dp[i] = max(dp[i-1], dp[i-2] + nums[i])\)
因为dp只取决于前两个数,可以用两个变量f1和f2优化,省去dp的数组空间开销。

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

代码

class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if(len(nums) == 0):
            return 0
        elif(len(nums) == 1):
            return nums[0]

        f2 = nums[0]
        f1 = max(nums[0], nums[1])
        for i in range(2,len(nums)):
            f1, f2 = max(f2+nums[i], f1), f1
        return f1

198. House Robber

标签:变量   用两个   lin   inline   turn   数组   金钱   mat   inpu   

原文地址:https://www.cnblogs.com/liaohuiqiang/p/9745976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!