# -*- coding: utf-8 -*-
'''
@target: 求解一个最大子数组
@author: dawang
@date: 2017.9.9
'''
def maxSubArray(l):
length = len(l)
if 1 == length: # 递归终止条件
return l
mid = length // 2
l_max = maxSubArray(l[:mid])
r_max = maxSubArray(l[mid:])
l_c_max = float("-inf") # 由于数据存在负数, 不能使用0
r_c_max = float("-inf")
temp = 0 # 记录横跨数组的最大值
l_index = 0
# for index, item in enumerate(l[mid - 1::-1]):
# temp += item
# if temp > l_c_max:
# l_c_max = temp
# l_index = index
i = mid - 1
while i >= 0:
temp += l[i]
if temp > l_c_max:
l_c_max = temp
l_index = i
i -= 1
r_index = 0
temp = 0
for index, item in enumerate(l[mid:]):
temp += item
if temp > r_c_max:
r_c_max = temp
r_index = index + mid
c_max = l[l_index:mid]+ l[mid:r_index + 1]
if sum(l_max) > sum(r_max) and sum(l_max) >sum(c_max):
return l_max
if sum(r_max) > sum(l_max) and sum(r_max) >sum(c_max):
return r_max
if sum(c_max) > sum(r_max) and sum(c_max) >sum(l_max):
return c_max
A = [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
print maxSubArray(A)
最大子数组问题-递归法 @ Python
最新推荐文章于 2022-03-18 07:30:00 发布