Run max-Kadane and min-Kadane simultaneously. Handle the all-negative edge case.
function maxSubarraySumCircular(nums):
totalSum = 0
maxSum = nums[0]
curMax = 0
minSum = nums[0]
curMin = 0
for num in nums:
curMax = max(curMax + num, num)
maxSum = max(maxSum, curMax)
curMin = min(curMin + num, num)
minSum = min(minSum, curMin)
totalSum += num
if maxSum < 0:
return maxSum
return max(maxSum, totalSum - minSum)
time, space.