上一道利用到数学归纳法的题目是求最大子列和的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
很屌有没有!!!!!!!!!巧妙的用平行赋值啊!
同一种算法思想,同一种语言,不同的写法也能导致运行时间的天壤之别,给大神跪了