leetcode: 最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

1
2
3
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

首先,我们的第一个想法是所有可能是有穷的,暴力破解是ok的,但是想想就很麻烦,毕竟所有结果遍历一遍是指数递增的。所以我们就需要找到一些他的规律

  1. 定义一个函数f(n),以第n个数为结束点的子数列的最大和,存在一个递推关系f(n) = max(f(n-1) + A[n], A[n]);
  2. 将这些最大和保存下来后,取最大的那个就是,最大子数组和。因为最大连续子数组 等价于 最大的以n个数为结束

有了这样的规律(不能说都是网上找来的= =),就不难得到推导代码了

1
2
3
4
5
6
7
8
9
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i in range(1, len(nums)):
nums[i]= nums[i] + max(nums[i-1], 0)
return max(nums)

这一题说简单也简单,只要根据规律写代码就好了,但是说难也难,因为没有规律就要么暴力或者滑窗的方法就要麻烦许多,不得不感叹一下,数学大法好啊

咸鱼一直在鸽,外面风好大,咸鱼好害怕。