最大子数组问题(Maximum subarray problem)

参考: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值