2

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')
Kias
  • 47
  • 5

0 Answers0