1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
function maxSubArray(nums) { return findMax(nums, 0, nums.length - 1); }
function findMax(arr, left, right) { if (left === right) { return arr[left] } else { let mid = Math.floor((left + right) / 2);
let leftMax = findMax(arr, left, mid), rightMax = findMax(arr, mid + 1, right), crossMax = findCrossMax(arr, mid, left, right);
return Math.max(leftMax, rightMax, crossMax); } }
function findCrossMax(arr, mid, left, right) {
let leftMax = arr[mid], leftSum = 0; for (let i = mid; i >= left; i--) { leftSum += arr[i]; leftMax = Math.max(leftMax, leftSum); }
let rightMax = arr[mid + 1], rightSum = 0; for (let i = mid + 1; i <= right; i++) { rightSum += arr[i]; rightMax = Math.max(rightMax, rightSum); }
return leftMax + rightMax; }
maxSubArray([-2, 1, -3, 4, -1, 2, 1, -5, 4])
|