🔢
Algorithms & Data
Ctrlk
  • Overview
    • 1. Sort
    • 2. Data Structures
    • 3. How to construct Algorithm? Paradigm
  • Algorithm Problems
    • Problem Sources
    • AlgoExpert
    • Daily Algorithms
      • 1. Topological Sort
      • 2. MST- Prim, Kruskal
      • 3. Cycle in a Graph
      • 4. Maximum sub array sum
        • Problem
        • Solutions
          • Brute Force
          • Divide And Conquer
          • Kadane's Algorithm - Dynamic
        • Empty Array allowed
        • Empty Array not allowed
        • Empty Array Not Allowed + circular
      • 5. Detect a Cycle in a graph with a disjoint set (Union Find)
      • 6. Kruskal's Algorithm - Union Find
      • 7. Prim's Algorithm - Priority Queue
      • 8. Sort Array nlogn
      • 9. Shortest path - BFS
      • 10. Dijkstra algorithm
      • 11. Minimum spanning tree - points
      • 12. Minimum depth in a binary tree
      • 13. [Counting Sort]: H-index
      • 14. [shortest path]: Floyd-Warshall
      • 15. [Linked List]: reverse list
      • 16. [Linked List]: swap nodes in pairs
      • 17.[Linked List]: Merge k Sorted Lists
      • 18.[Linked list]:234. Palindrome Linked List
      • 19. [Linked List]: Linked List Cycle
      • 20. [Linked List] Reverse Linked List II
      • 21. [Linked List] sort a list - asc
      • 22. [Sort] Quick Sort
      • 23. [matrix] Spiral Matrix
      • 24. [matrix] Number of Islands
      • 25. [matrix] Valid Sudoku
      • 26. [matrix] Sudoku Solver
  • Top 75 LeetCode Questions to Save Your Time
    • Source
    • Problems
  • Tip
    • Page 2
    • LinkedList
Powered by GitBook
On this page
  1. Algorithm Problems
  2. Daily Algorithms
  3. 4. Maximum sub array sum
  4. Solutions

Divide And Conquer

pic is wrong
LogoMaximum Subarray - LeetCodeLeetCode
PreviousBrute ForceNextKadane's Algorithm - Dynamic

Last updated 16 days ago

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    return maxSubArraySum(nums, 0, nums.length - 1);
};

function maxSubArraySum(arr, left, right) {
    if (left === right) return arr[left];

    const mid = left + Math.floor((right - left) / 2);

    const leftMax = maxSubArraySum(arr, left, mid);
    const rightMax = maxSubArraySum(arr, mid + 1, right);
    const crossMax = maxCrossSum(arr, mid, left, right);

    return Math.max(leftMax, rightMax, crossMax);
}

function maxCrossSum(arr, mid, left, right) {

    // left
    let leftMaxSum = -Infinity;
    let leftSum = 0;
    for (let i = mid; i >= left; i--) {
        const curr = arr[i];
        leftSum += curr;
        leftMaxSum = Math.max(leftMaxSum, leftSum);        
    }

    // right
    let rightMaxSum = -Infinity;
    let rightSum = 0;
    for (let i = mid + 1; i <= right; i++) {
        const curr = arr[i];
        rightSum += curr;
        rightMaxSum = Math.max(rightMaxSum, rightSum);
    }

    return leftMaxSum + rightMaxSum;
}