https://leetcode-cn.com/problems/maximum-subarray/
- 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和
动态规划
dp方程: f(i) = Math.max(f(i), f(i - 1) + nums[i])
var maxSubArray = function(nums) {
for (let i = 1; i < nums.length; i++) {
nums[i] = Math.max(nums[i], nums[i] + nums[i - 1]);
}
return Math.max(...nums)
};
分治
var maxSubArray = function(nums) {
if (!nums.length) return -Infinity
if (nums.length === 1) return nums[0]
let right = nums.length - 1, mid = Math.floor(right/2);
let lMax = maxSubArray(nums.slice(0, mid)),
rMax = maxSubArray(nums.slice(mid + 1, right + 1));
let lMaxSum = 0, rMaxSum = 0;
for (let i = mid - 1, currSum = 0; i >= 0; i--){
currSum += nums[i];
lMaxSum = Math.max(lMaxSum, currSum);
}
for (let i = mid + 1, currSum = 0; i <= right; i++){
currSum += nums[i];
rMaxSum = Math.max(rMaxSum, currSum);
}
return Math.max(
lMaxSum + nums[mid] + rMaxSum,
lMax,
rMax
);
}