Given a circular array C of integers represented by A
, find the maximum possible sum of a non-empty subarray of C.
Here, a circular array means the end of the array connects to the beginning of the array. (Formally, C[i] = A[i]
when 0 <= i < A.length
, and C[i+A.length] = C[i]
when i >= 0
.)
Also, a subarray may only include each element of the fixed buffer A
at most once. (Formally, for a subarray C[i], C[i+1], ..., C[j]
, there does not exist i <= k1, k2 <= j
with k1 % A.length = k2 % A.length
.)
Example 1:
Input: [1,-2,3,-2]
Output: 3
Explanation: Subarray [3] has maximum sum 3
Example 2:
Input: [5,-3,5]
Output: 10
Explanation: Subarray [5,5] has maximum sum 5 + 5 = 10
思路:如果做过Maximum Subarray ,这题如果看了下面的图示,应该很简单;
循环的array,那么最大的subarry,那么中间就是最小的subarray,那么问题转换为求一个最大,和最小,然后两者比最大值。
注意的是:如果求出来最大的还是小于0,那么直接return 最大的;因为比如:[-2,-3,-1] total -6, globalmax :-1, globalmin : -6
如果直接Math.max(total - globalmin, globalmax); 就会return 0, 是不对的,globalmax < 0,直接return globalmax即可;
class Solution {
public int maxSubarraySumCircular(int[] A) {
int total = 0;
int localmax = 0;
int globalmax = A[0];
int localmin = 0;
int globalmin = A[0];
for(int a: A) {
localmax = Math.max(localmax + a, a);
globalmax = Math.max(globalmax, localmax);
localmin = Math.min(localmin + a, a);
globalmin = Math.min(globalmin, localmin);
total += a;
}
return globalmax > 0 ? Math.max(total - globalmin, globalmax) : globalmax;
}
}