
参考了灵神的题解,然后只要用动态规划求解子数组的最大和和最小和就可以

java
class Solution {
public int maxSubarraySumCircular(int[] nums) {
int sum = nums[0];
//变量记录普通子数组的最大和
int currentMax = nums[0];
int globalMax = nums[0];
//变量记录普通子数组的最小和
int currentMin = nums[0];
int globalMin = nums[0];
//动态规划求解普通子数组的最大和和最小和
for (int i = 1; i < nums.length; i++) {
sum += nums[i];
currentMax = Math.max(currentMax + nums[i], nums[i]);
globalMax = Math.max(globalMax, currentMax);
currentMin = Math.min(currentMin + nums[i], nums[i]);
globalMin = Math.min(globalMin, currentMin);
}
return sum == globalMin ? globalMax : Math.max(globalMax, sum - globalMin);
}
}