198. House Robber,又发现一道数学归纳法在leetcode中的应用题

上一道利用到数学归纳法的题目是求最大子列和的Kadane算法,今天做leetcode又遇到了一道及其类似的题目,也是从零开始一步步求解最优解,直至最后得出我们想要的答案。这种思想非常的重要!!
题目地址:198. House Robber
它的算法思想是:从0开始一步步生成最终的数列,得出最大的值(是不是和kadane算法很像!!)
f(0) = nums[0]
f(1) = max(num[0], num[1])
f(k) = max( f(k-2) + nums[k], f(k-1) )

然后我就开始写代码。这是我写的代码:

class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        return self.func(nums, len(nums))


    def func(self, nums, k):
            if k == 0: return 0
            if k == 1: return nums[0]
            if k == 2: return max(nums[0], nums[1])
            return max(self.func(nums, k-2) + nums[k-1], self.func(nums, k-1))

结果是Time Limit exceed,泪奔

同样的算法思想,大神的写法如下:

class Solution(object):
    def rob(self, nums):
        last, now = 0, 0
        for i in nums:
            last, now = now, max((last + i), now)
        return now

26ms
很屌有没有!!!!!!!!!巧妙的用平行赋值啊!
同一种算法思想,同一种语言,不同的写法也能导致运行时间的天壤之别,给大神跪了

猜你喜欢

转载自blog.csdn.net/the__apollo/article/details/78584616