实现最大子序列,其主要需要注意的是’连续’一词。
然而我在查看《算法导论》书本时,发现代码本身无问题,同样的递归代码在C++中是可以正常运行的,在python当中却无法正常运行,需要添加哨兵才可以正常的使用。
注:代码本身无问题
上代码:
#coding=utf-8
class InfoType:
def __init__(self, leftPos, rightPos, value):
self.__leftPos = leftPos
self.__rightPos = rightPos
self.__value = value
def getLeftPos(self):
return self.__leftPos
def getRightPos(self):
return self.__rightPos
def getValue(self):
return self.__value
def __str__(self):
return '{0}, {1}, {2}'. format(self.getLeftPos(), self.getRightPos(), self.getValue())
def findMaxCrossingSubArray(array, low, mid, high):
leftSum = -100000000
maxLeftPos = 0
MaxSum = 0
for i in range(mid, low, -1):
MaxSum = MaxSum + array[i]
if MaxSum > leftSum:
leftSum = MaxSum
maxLeftPos = i
#print(leftSum, MaxSum, i)
rightSum = -100000000
maxRightPos = 0
MaxSum = 0
for i in range(mid + 1, high):
MaxSum = MaxSum + array[i]
if MaxSum > rightSum:
rightSum = MaxSum
maxRightPos = i
return InfoType(maxLeftPos, maxRightPos, leftSum + rightSum)
def findMaximumSubArray(array, low, high):
if low == high:
return InfoType(low, high, array[low])
mid = (low + high) // 2
leftMaxSubArray = findMaximumSubArray(array, low, mid)
rightMaxSubArray = findMaximumSubArray(array, mid + 1, high)
midMaxSubArray = findMaxCrossingSubArray(array, low, mid, high)
if leftMaxSubArray.getValue() >= rightMaxSubArray.getValue() and \
leftMaxSubArray.getValue() >= midMaxSubArray.getValue():
return leftMaxSubArray
elif rightMaxSubArray.getValue() >= leftMaxSubArray.getValue() and \
rightMaxSubArray.getValue() >= midMaxSubArray.getValue():
return rightMaxSubArray
else:
return midMaxSubArray
if __name__ == '__main__':
import sys
sys.setrecursionlimit(1000)
A = [0, 4, 1, 5, 7, 3, 9, 11, 2, 6, 3, 7, 0]
result = findMaximumSubArray(A, 0, len(A) - 1)
print(result)
ps:两头的’0’为哨兵。