算法学习_python-7

最大子序列:


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

def find_crossing_subarray(A,low,mid,high):
    left_sum = float("-inf")
    sum  = 0
    max_left = 0
    max_right = 0
    for i in range(mid,low-1,-1):
        sum = sum + A[i]
        if sum > lef_sum:
            left_sum = sum
            max_left = i
    sum = 0
    for j in range(mid+1,high+1,1):
        sum = sum + A[j]
        if sum > right_sum:
            right_sum = sum
            max_right = j
            
    return [max_left,max_right,left_sum+right_sum]
import math

def find_maximum_subarray(A,low,high):
    if high == low:
        return (low,high,A[low])
    else:
        mid = math.floor((low+high)/2)
        #递归部分
        #最大子序列在左边
        [left_low,left_high,left_sum] = find_maximum_subarray(A,low,mid)
        #最大子序列在右边
        [right_low,right_high,right_sum] = find_maximum_subarray(A,mid+1,high)
        #最大子序列在中间
        [cross_low,cross_high,cross_sum] = find_max_crossing_subarray(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=[-1,2,3,-4]
    max = find_maximum_subarray(a, 0, len(a)-1)
    print (max)
输出[1, 2, 5]
时间复杂度为nlgn,a[1]+a[2] = 5
当A[1,2,...n]为最大子序列,判断A[1,2,...n,n+1]的最大子序列:

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

def j_subarry(A):
    
    M = 0
    M_high = len(A)-1
    for j in range(0,len(A)-1):
        M = M + A[j]
        print(M)
    print(A[len(A)-1])
    if M+A[len(A)-1] > M:
        M = M + A[len(A)-1]
        M_high = M_high + 1
    else:
        M = M
        M_high = M_high
    return (M_high,M)
a = j_subarry([1,4,-2])
print(a)

 时间复杂度为n   
(2, 5)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值