leetcode 53. 最大子数组和

96 阅读1分钟

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);
};