您的位置:首页 > 其它

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

2017-11-20 17:41 375 查看
上一道利用到数学归纳法的题目是求最大子列和的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

很屌有没有!!!!!!!!!巧妙的用平行赋值啊!

同一种算法思想,同一种语言,不同的写法也能导致运行时间的天壤之别,给大神跪了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: