分为两种情况,最大子数组在中间和最大子数组分散在两边。
通过计算最大子数组和和最小子数组和来求解。
时间复杂度:O(N)
空间复杂度: O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| func maxSubarraySumCircular(nums []int) int { total := nums[0] currMax := nums[0] currMin := nums[0] sumMax := nums[0] sumMin := nums[0]
for i := 1; i < len(nums); i++ { total += nums[i] currMax = max(currMax+nums[i], nums[i]) sumMax = max(sumMax, currMax) currMin = min(currMin+nums[i], nums[i]) sumMin = min(sumMin, currMin) }
if sumMin == total { return sumMax } else { return max(total-sumMin, sumMax) } }
func min(a, b int) int { if a > b { return b } return a }
func max(a, b int) int { if a > b { return a } return b }
|