1、前言
2、思路
主要是一个转换问题,有两个case,case1是连续子数组都在数组中;
case2 是连续子数组是首尾相连。所以要将 case2转换一下,求最大和,其实就是求 总和 - 中间部分最小和。
3、代码
class Solution {
public int maxSubarraySumCircular(int[] nums) {
int n = nums.length;
int sumMax = 0, max = Integer.MIN_VALUE, sumMin = 0, min = Integer.MAX_VALUE;
int sum = 0;
for(int i = 0; i < n; i++){
sum += nums[i];
// 最大和
sumMax += nums[i];
max = Math.max(max, sumMax);
if(sumMax < 0){
sumMax = 0;
}
// 最小和
sumMin += nums[i];
min = Math.min(min, sumMin);
if(sumMin > 0){
sumMin = 0;
}
}
return sum - min == 0 ? max : Math.max(max, sum - min);
}
}