I am new to Python. Now, I need to implement a Maximum-Subarray Problem, using divide-and-conquer.
However, Sum
is correct, but low
and high
is wrong.
For example: Input
16
13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7
Output should be:
Low = 8 High = 11 Sum = 43
My output:
Low = -1 High = 10 Sum = 43
It is so weird, I don't know how to fix.
Here is my code:
def Max_SubArray(num_list):
low = 0
high = len(num_list)
low, high, sum = MaxSumSubAaray(num_list, low, high-1)
print( "Low =", low, "High =", high, "Sum =", sum )
def MaxSumSubAaray(num_list,low,high):
if low == high:
return low, high, num_list[low]
if low > high:
return low,high, -999999999
leftMaxSum = 0
rightMaxSum = 0
mid = (low+high)//2
leftLow, leftHigh, leftMaxSum = MaxSumSubAaray(num_list,low,mid-1)
rightLow, rightHigh, rightMaxSum = MaxSumSubAaray(num_list,mid+1,high)
crossLow, crossRight, crossMaxSum = MaxCrossSubArray( num_list,low,mid,high)
if ( leftMaxSum > rightMaxSum and leftMaxSum > crossMaxSum ):
return leftLow, leftHigh, leftMaxSum
elif ( rightMaxSum > leftMaxSum and rightMaxSum > crossMaxSum ):
return rightLow, rightHigh, rightMaxSum
else:
return crossLow, crossRight, crossMaxSum
def MaxCrossSubArray( num_list, low, mid, high ):
sum = 0
midLeftSum = 0
midLeftIndex = -1
#i = 0
for i in range(mid-1,low-1,-1): # index from mid-1 to low
sum += num_list[i]
if midLeftSum < sum:
midLeftSum = sum
midLeftIndex = i
midRightSum = 0
midRightIndex = -1
sum = 0
#j = 0
for j in range(mid+1,high+1): # index from mid+1 to high
sum += num_list[j]
if midRightSum < sum:
midRightSum = sum
midRightIndex = j
crossLow = midLeftIndex
crossHigh = midRightIndex
crossSum = midLeftSum + midRightSum + num_list[mid]
return crossLow, crossHigh, crossSum
n = int(input())
while n != 0:
num_list = []
for i in range(n):
data = int(input())
num_list.append(data)
Max_SubArray(num_list)
n = int(input())
print('OK')