918.环形子数组的最大和

分为两种情况,最大子数组在中间和最大子数组分散在两边。

通过计算最大子数组和和最小子数组和来求解。

时间复杂度: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
}

918.环形子数组的最大和
https://blog.jerrylee.me/2021/09/bfe779944b47.html
作者
Jerry Lee
发布于
2021年9月20日
许可协议