参考:Wikipedia
最大子数组问题就是在一个一维的数组中找到和最大的一个连续的子数组。给定的数组一般包括正数负数和0。
这个问题的一些属性如下:
1. 如果数组内的所有元素非正,那么问题的解就是其中最大的一个元素。
2. 如果数组内所有的元素非负,那么问题的解就是所有元素之和。
3. 空的集合是无效的。
4. 可以有多个子集能得到最大和。
解决这类问题的方法包含以下几种:暴力求解,分治策略,动态规划。
分治策略(Divide and Conquer)
原理:将数组分成前后两个部分,A[lo,hi]的任意连续子数组可以分成以下三种情况
1. 完全位于子数组A[lo,mi]之间。
2. 完全位于子数组A[mi+1,mi]之间。
3. 跨越了中点mi。
这样我们只需要找出两边的子数组,并按照一定规则合并即可。
Kandane's algorithm
原理:令以i位置为末尾的子数组中的最大和子数组为B(i),则B(i+1)=max(A(i+1),A(i+1)+B(i)),其中A(i+1)是i+1处的元素。
依据递推公式我们可以得到以下代码。
def max_subarray(A):
max_ending_here = max_so_far = A[0]
for x in A[1:]:
max_ending_here = max(x, max_ending_here + x)
max_so_far = max(max_so_far, max_ending_here)
return max_so_far