leetcodealgorithms-templates1-arrays
 
// Brute Force: O(n^2)
function bruteForce(nums) {
    let maxSum = nums[0];
 
    for (let L = 0; L < nums.length; L++) { 
        let curSum = 0;
        for (let R = L; R < nums.length; R++) {
            curSum += nums[R];
            maxSum = Math.max(maxSum, curSum);
        }    
    }       
    return maxSum;
}
 
// Kadane's Algorithm: O(n)
function kadanes(nums) {
    let maxSum = nums[0];
    let curSum = 0;
 
    for (let n of nums) {
        curSum = Math.max(curSum, 0);
        curSum += n;
        maxSum = Math.max(maxSum, curSum);
    }
    return maxSum;
}
 
// Return the left and right index of the max subarray sum,
// assuming there's exactly one result (no ties).
// Sliding window variation of Kadane's: O(n)
function slidingWindow(nums) {
    let maxSum = nums[0];
    let curSum = 0;
    let maxL = 0, maxR = 0;
    let L = 0;
 
    for (let R = 0; R < nums.length; R++) {
        if (curSum < 0) {
            curSum = 0;
            L = R;
        }
        curSum += nums[R];
        if (curSum > maxSum) {
            maxSum = curSum;
            maxL = L; 
            maxR = R;     
        }    
    }    
    return [maxL, maxR];
}