最大子数组问题-递归法 @ Python

# -*- coding: utf-8 -*-
'''
@target: 求解一个最大子数组
@author: dawang
@date: 2017.9.9
'''


def maxSubArray(l):
    length = len(l)
    if 1 == length: # 递归终止条件
        return l
    mid = length // 2
    l_max = maxSubArray(l[:mid])
    r_max = maxSubArray(l[mid:])

    l_c_max = float("-inf") # 由于数据存在负数, 不能使用0
    r_c_max = float("-inf")
    temp = 0    # 记录横跨数组的最大值
    l_index = 0

    # for index, item in enumerate(l[mid - 1::-1]):
    #     temp += item
    #     if temp > l_c_max:
    #         l_c_max = temp
    #         l_index = index

    i = mid - 1
    while i >= 0:
        temp += l[i]
        if temp > l_c_max:
            l_c_max = temp
            l_index = i
        i -= 1

    r_index = 0
    temp = 0
    for index, item in enumerate(l[mid:]):
        temp += item
        if temp > r_c_max:
            r_c_max = temp
            r_index = index + mid

    c_max = l[l_index:mid]+ l[mid:r_index + 1]

    if sum(l_max) > sum(r_max) and sum(l_max) >sum(c_max):
        return l_max
    if sum(r_max) > sum(l_max) and sum(r_max) >sum(c_max):
        return r_max
    if sum(c_max) > sum(r_max) and sum(c_max) >sum(l_max):
        return c_max


A = [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
print maxSubArray(A)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值