5a3c1b2d创建于 2025年8月3日历史提交
/**
 * https://leetcode.com/problems/maximum-subarray/
 * Time O(N^2) | Space O(1)
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function (nums, maxSum = -Infinity) {
    for (let i = 0, sum = 0; i < nums.length; i++) {
        for (let j = i; j < nums.length; j++) {
            sum += nums[j];
            maxSum = Math.max(maxSum, sum);
        }
    }

    return maxSum;
};

/**
 * https://leetcode.com/problems/maximum-subarray/
 * Time O(N * log(N)) | Space O(log(N))
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function (nums, left = 0, right = nums.length - 1) {
    const isBaseCase = right < left;
    if (isBaseCase) return -Infinity;

    const mid = (left + right) >> 1;
    const guess = nums[mid];
    const leftSum = getLeftSumFromMid(nums, mid, left);
    const rightSum = getRightSumFromMid(nums, mid, right);
    const sum = guess + leftSum + rightSum;

    const leftHalf = maxSubArray(nums, left, mid - 1);
    const rightHalf = maxSubArray(nums, mid + 1, right);

    return Math.max(sum, leftHalf, rightHalf);
};

const getLeftSumFromMid = (nums, mid, left, sum = 0, maxSum = 0) => {
    for (let i = mid - 1; left <= i; i--) {
        sum += nums[i];
        maxSum = Math.max(maxSum, sum);
    }

    return maxSum;
};

const getRightSumFromMid = (nums, mid, right, sum = 0, maxSum = 0) => {
    for (let i = mid + 1; i <= right; i++) {
        sum += nums[i];
        maxSum = Math.max(maxSum, sum);
    }

    return maxSum;
};

/**
 * https://leetcode.com/problems/maximum-subarray/
 * Time O(N) | Space O(1)
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function (nums) {
    let [runningSum, maxSum] = [nums[0], nums[0]];

    for (let i = 1; i < nums.length; i++) {
        const num = nums[i];
        const sum = runningSum + num;

        runningSum = Math.max(num, sum);
        maxSum = Math.max(maxSum, runningSum);
    }

    return maxSum;
};