c++
class Solution {
public:
int mergeSort(vector<int> &sum, int l, int r) {
if (l >= r) return sum[l];
int mid = (l + r) >> 1;
int left = mergeSort(sum, l, mid);
int right = mergeSort(sum, mid + 1, r);
int k = l, p1 = l, p2 = mid + 1, pre = 0x7f7f7f7f, aft = -pre;
while (p1 <= mid || p2 <= r) {
if (p2 > r || (p1 <= mid && sum[p1] <= sum[p2])) {
pre = min(pre, sum[p1]);
tmp[k++] = sum[p1++];
} else {
aft = max(aft, sum[p2]);
tmp[k++] = sum[p2++];
}
}
for (int i = l; i <= r; i++) sum[i] = tmp[i];
return max(max(left, right), aft - pre);
}
vector<int> tmp;
int maxSubArray(vector<int>& nums) {
vector<int> sum(nums.size() + 1, 0);
for (int i = 0; i < nums.size(); i++) sum[i + 1] = sum[i] + nums[i];
while (tmp.size() < sum.size()) tmp.push_back(0);
return mergeSort(sum, 1, sum.size() - 1);
}
};
js
var mergeSort = function(sum, tmp, l, r) {
if (l >= r) return sum[l];
var mid = Math.floor((l + r) / 2);
var left = mergeSort(sum, tmp, l, mid);
var right = mergeSort(sum, tmp, mid + 1, r);
var k = l, p1 = l, p2 = mid + 1, pre = 0x7f7f7f7f, aft = -pre;
while (p1 <= mid || p2 <= r) {
if (p2 > r || (p1 <= mid && sum[p1] <= sum[p2])) {
pre = Math.min(pre, sum[p1]);
tmp[k++] = sum[p1++];
} else {
aft = Math.max(aft, sum[p2]);
tmp[k++] = sum[p2++];
}
}
return Math.max(aft - pre, left, right);
}
var maxSubArray = function(nums) {
var sum = new Array(nums.length + 1).fill(0), tmp = new Array(nums.length + 1).fill(0);
for(var i = 0; i < nums.length; i++) sum[i + 1] = sum[i] + nums[i];
return mergeSort(sum, tmp, 1, sum.length -1);
};