Python实现求解最大子数组问题

#! /usr/bin/env python
#coding=utf-8

def MaxCrossSubarray(a, low, mid, high):
    left_sum=-65535
    sum=0
    for i in range(mid, low-1, -1):#递减,实现mid至low!!!
        sum=sum+a[i]
        if sum>left_sum:
            left_sum=sum
            max_left=i
    right_sum=-65535
    sum=0
    for j in range(mid+1, high+1):
        sum=sum+a[j]
        if sum>right_sum:
            right_sum=sum
            max_right=j
    return (max_left, max_right, left_sum+right_sum)

def MaxSubarray(a, low, high):
    if high==low:
        return (low, high, a[low])
    else:
        mid=(low+high)/2
        (left_low, left_high, left_sum)=MaxSubarray(a, low, mid)
        (right_low, right_high, right_sum)=MaxSubarray(a, mid+1, high)
        (cross_low, cross_high, cross_sum)=MaxCrossSubarray(a, low, mid, high)
        if left_sum>=right_sum and left_sum>=cross_sum:
            return (left_low, left_high, left_sum)
        elif right_sum>=left_sum and right_sum>=cross_sum:
            return (right_low, right_high, right_sum)
        else:
            return (cross_low, cross_high, cross_sum)

if __name__ == '__main__':
    a=[13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
    max = MaxSubarray(a, 0, len(a)-1)
    print max
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值