自己写的111个用例过了73个
看了看题解 修修改改
思路:
1:最大数组和在中间,正常dp解法
2:最大数组和是跨越头尾,回头了,从两边出发往中间靠拢必须都是最大,那就说明中间段就是最小,找最小
class Solution {
public int maxSubarraySumCircular(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
int sum = dp[0];
int max = dp[0];
for(int i = 1; i < dp.length; i ++){
sum += nums[i];
dp[i] = nums[i] + Math.max(dp[i - 1], 0);
max = Math.max(dp[i], max);
}
int min = 0;
for (int i = 1; i < dp.length - 1; i++) {
dp[i] = nums[i] + Math.min(0, dp[i - 1]);
min = Math.min(dp[i], min);
}
return Math.max(sum - min, max);
}
}