分治策略 获取最大子数组

暴力求解:双重for循环
递归求解:子数组有三种情况 左边 中间 右边

 

#!/usr/bin/env python3
import random

a = [random.randrange(1000,9999) for i in range(20)]

print(a)

def basic_test(a):
    max_value = a[1]-a[0]
    input_day = 0
    out_day = 1
    for i in range(len(a)-1):
        for j in range(i,len(a)):
            if(a[j]-a[i]>max_value):
                input_day = i
                out_day = j
                max_value = a[j]-a[i]
    return input_day,out_day,max_value

def test(a):

    length = len(a)
    if length==2:
        return 0,1,a[1]-a[0]
    if length<2:
        return False
    mid = length//2
    left_a = a[:mid]
    left_res = test(left_a)
    right_a = a[mid+1:]
    right_res = test(right_a)

    start = mid
    end = mid + 1
    max_start = mid
    max_end = mid+1
    #右边最大值
    while end<=length-1:
        if a[max_end] < a[end]:
            max_end = end
        end += 1
    #获取左边最小值
    while start>=0:
        if a[start] < a[max_start]:
            max_start = start
        start -= 1
    max_list = [max_start,max_end,a[max_end] - a[max_start]]
    if left_res and left_res[2]>max_list[2]:
        max_list = left_res
    if right_res and right_res[2]>max_list[2]:
        max_list = right_res
    return max_list


val = basic_test(a)
print(val)
print(test(a))

  

posted @ 2017-11-05 23:16  junmo-c  阅读(155)  评论(0编辑  收藏  举报