LeetCode 918
如果不是循环数组的话,我们可以使用Kadane算法。要求循环数组中最大字串和,那么有两种可能,一种是这个最大字串就在普通的数组中,另外一种就是首尾相接
整个数组的total sum是不变的,如果说我们首尾部相接的部分是最大的,那么剩下的部分就应该是最小的。所以这种情况是 totalsum -minsubarray。
def maxSubarraySumCircular(self, A: List[int]) -> int:
al = len(A)
maxresult = A[0]
currentMax = A[0]
minResult = A[0]
currentMin = A[0]
sumResult = A[0]
for i in range(1, al):
#求最大
currentMax = max(A[i], currentMax+A[i])
maxresult = max(currentMax, maxresult)
#求最小
currentMin = min(A[i], currentMin+A[i])
minResult = min(currentMin, minResult)
#求和
sumResult += A[i]
#如果小于0,那么直接返回结果
if maxresult < 0: return maxresult
return max(maxresult, sumResult - minResult)