python实现算法导论伪代码——求最大连续子数组

给定一个数组,求出和最大的连续子数组。返回子数组的开始位,结束位,和。

思路:分治策略,将数组一分为二,最大子数组可能在左半,或右半,或横跨中间。不断分割,直到子问题可解,求出子数组,再逐步合并。

def Max_subarray(a,low,high): #初始输入的low和high应为0,len(a)-1
    if high == low:
        return [low, high, a[low]]
    else:
        mid = int((high+low)/2)
        L = Max_subarray(a,low,mid)
        R = Max_subarray(a,mid+1,high)
        M = Max_cross_subarray(a,low,mid,high)
        if L[2]>=R[2] and L[2]>=M[2]:
            return L
        if R[2]>=L[2] and R[2]>=M[2]:
            return R
        else:
            return M

def Max_cross_subarray(a,low,mid,high):
    max_left = mid
    max_right = mid
    left_sum = -float("inf")
    right_sum = -float("inf")
    sum = 0
    i = mid
    while i>= low:
        sum = sum + a[i]
        if sum >= left_sum:
            left_sum = sum
            max_left = i
        i=i-1
    sum = 0
    j = mid+1
    while j<= high:
        sum = sum + a[j]
        if sum >= right_sum:
            right_sum = sum
            max_right = j
        j=j+1
    return [max_left, max_right, left_sum+right_sum]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值