1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| class Solution {
public int maxSubArray(int[] nums) {
return get(nums, 0, nums.length - 1).mSum;
}
private static class Status {
// 区间和,最大前缀和,最大后缀和,最大子段和
int iSum, lSum, rSum, mSum;
Status(int iSum, int lSum, int rSum, int mSum) {
this.iSum = iSum;
this.lSum = lSum;
this.rSum = rSum;
this.mSum = mSum;
}
}
private Status get(int[] a, int l, int r) {
if (l == r) {
int x = a[l];
return new Status(x, x, x, x);
}
int m = (l + r) >> 1;
Status left = get(a, l, m);
Status right = get(a, m + 1, r);
return pushUp(left, right);
}
private Status pushUp(Status L, Status R) {
int iSum = L.iSum + R.iSum;
int lSum = Math.max(L.lSum, L.iSum + R.lSum);
int rSum = Math.max(R.rSum, R.iSum + L.rSum);
int mSum = Math.max(Math.max(L.mSum, R.mSum), L.rSum + R.lSum);
return new Status(iSum, lSum, rSum, mSum);
}
}
|