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
|
var maxSubArray = function(nums) { return fz(0, nums.length-1, nums) };
function fz(left, right, nums) { if (left === right) { return nums[left] } let mid = left + ((right - left) >> 1); let leftMax = Number.MIN_SAFE_INTEGER let rightMax = Number.MIN_SAFE_INTEGER let midMax = crossNum(left, right, nums) leftMax = fz(left, mid, nums) rightMax = fz(mid+1, right, nums) return Math.max(Math.max(midMax, rightMax), leftMax); }
function crossNum(left, right, nums) { if (left === right) { return nums[left] } let mid = left + ((right - left) >> 1) let leftSum = 0; let leftMax = Number.MIN_SAFE_INTEGER; for (let i = mid; i >= left; i--) { leftSum += nums[i]; leftMax = Math.max(leftMax, leftSum) } let rightSum = 0; let rightMax = Number.MIN_SAFE_INTEGER; for (let i = mid + 1; i <= right; i++) { rightSum += nums[i]; rightMax = Math.max(rightMax, rightSum) }
return rightMax + leftMax; }
|