使用分治算法求解最大子数组问题

def MaxCrossSubarray(num,mid,low,high):
    leftsum=0
    leftmax=-1000000
    rightsum=0
    rightmax=-1000000    
    for i in range(mid,low-1,-1):
        leftsum=leftsum+num[i]
        if leftsum>leftmax:
            leftmax=leftsum
            leftlow=i
    for j in range(mid+1,high+1):
        rightsum=rightsum+num[j]
        if rightsum>rightmax:
            rightmax=rightsum
            righthigh=j
    sum=leftmax+rightmax
    return (leftlow,righthigh,sum)

def MaxSubarray(num,low,high):
    if low==high:
        return (low,high,num[low])
    else:
        mid=(low+high)//2
        (left_low,left_high,left_sum)=MaxSubarray(num,low,mid)
        (right_low,right_high,right_sum)=MaxSubarray(num,mid+1,high)
        (cross_low,cross_high,cross_sum)=MaxCrossSubarray(num,mid,low,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)
        elif(cross_sum>left_sum and cross_sum>right_sum):
            return (cross_low,cross_high,cross_sum)


    
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

 

转载于:https://www.cnblogs.com/mactep/p/6872727.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值