In [4]:
import sys
def findMaxCrossingSubArray(A, lo, mid, hi):
maxSumLeft, maxSumRight, sumLeft, sumRight = -sys.maxsize, -sys.maxsize, 0, 0
for i in range(mid, lo - 1, -1):
sumLeft = sumLeft + A[i]
if maxSumLeft < sumLeft:
maxSumLeft = sumLeft
for i in range(mid + 1, hi):
sumRight = sumRight + A[i]
if maxSumRight < sumRight:
maxSumRight = sumRight
totalSum = maxSumLeft + maxSumRight
if totalSum >= maxSumLeft and totalSum >= maxSumRight:
return totalSum
elif maxSumLeft >= totalSum and maxSumLeft >= maxSumRight:
return maxSumLeft
else:
return maxSumRight
In [2]:
from math import floor
import sys
def findMaxSubarray(A, lo, hi):
if lo == hi:
return -sys.maxsize
else:
mid = int(floor((lo + hi)/2))
leftSum = findMaxSubarray(A, lo, mid)
rightSum = findMaxSubarray(A, mid + 1, hi)
crossSum = findMaxCrossingSubArray(A, lo, mid, hi)
if leftSum >= rightSum and leftSum >= crossSum:
return leftSum
elif rightSum >= crossSum and rightSum >= leftSum:
return rightSum
else:
return crossSum
In [8]:
A = [1, 2, 3, 4]
B = [2, -1, 2, 3, 4, -5]
C = [-5, -4, -3, -2, -1]
print(findMaxSubarray(C, 0, len(C)))
In [ ]: