def max_subarray2(nums,low,high):
if low == high:
return (low, high, nums[low])
max_sum = min(nums)
left_idx, right_idx = 0, len(nums)
mid = (low+high)/2
cross_low, cross_high = mid, mid
left_max_sum = tmp_sum = 0
for i in range(mid,low-1,-1):
tmp_sum += nums[i]
if tmp_sum > left_max_sum:
cross_low = i
left_max_sum = tmp_sum
right_max_sum = tmp_sum = 0
for i in range(mid+1, high+1):
tmp_sum += nums[i]
if tmp_sum > right_max_sum:
cross_high = i
right_max_sum = tmp_sum
left_low, left_high, left_sum = max_subarray2(nums,low,mid)
right_low, right_high, right_sum = max_subarray2(nums,mid+1,high)
if left_sum >= left_max_sum+right_max_sum and left_sum >= right_sum:
return (left_low, left_high, left_sum)
elif right_sum >= left_max_sum+right_max_sum and right_sum >= left_sum:
return (right_low, right_high, right_sum)
else:
return (cross_low, cross_high, left_max_sum+right_max_sum)