题目:给一个环形的数组,求最大的连续子数组的和的最大值
如果不是环形的很好解决,贪心或者dp都是可以的。
我们考虑取的最大值的子数组的结构
1、没有环的情况下求最大值
2、没有环的情况下求最小值,然后这个子数组的两端连起来(因为是个环)就是最大值
边界处理:如果所有值都是负数的时候。这个时候我们根据上面第一种情况得到的是小于0,第二种情况得到的等于0的,但是实际上答案应该是第一种,因为第二种结果等于0对应的是一个数都不取,这是不符合条件的。
public class Leetcode0918 {
public static void main(String[] args) {
Leetcode0918 leetcode = new Leetcode0918();
// System.out.println(leetcode.maxSubarraySumCircular(new int[]{1, -2, 3, -2})); //3
// System.out.println(leetcode.maxSubarraySumCircular(new int[]{5,-3,5})); //10,
// System.out.println(leetcode.maxSubarraySumCircular(new int[]{3,-1,2,-1})); //4
System.out.println(leetcode.maxSubarraySumCircular(new int[]{-1, -2, -3})); //4
}
public int maxSubarraySumCircular(int[] A) {
int max = A[0];
int min = A[0];
int atMax = A[0];
int atMin = A[0];
int s = A[0];
for (int i = 1; i < A.length; i++) {
int x = A[i];
s += x;
atMax = Math.max(x, atMax + x);
atMin = Math.min(x, atMin + x);
max = Math.max(max, atMax);
min = Math.min(min, atMin);
}
if (max < 0) {
//边界处理,所有的数都小于0的时候
return max;
}
return Math.max(max, s - min);
}
}