输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
解题思路:
1. 暴力法,快慢指针,慢指针记录起点,快指针逐渐往后移动,同期记录最大值; 时间复杂度O(n^2)
2. 动态规划,分而治之;当只有两个数时,包含第2个数的最大子数组,要么是这个数组本身或者最后一个数自己;i个数的数组, 包含第i个数的最大子数组值为 Dp[i] = max(Dp[i-1]+nums[i], nums[i]); 从1往后,逐渐扩展,每次都计算包含最后一个数的最大值,最终所有最大值的最大值即为所求;
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
let preAmount = nums[0];
let max = preAmount;
for(let i=1; i< nums.length; i++){
if(preAmount + nums[i]> nums[i]){
preAmount = preAmount + nums[i];
}else{
preAmount = nums[i];
}
if(preAmount > max) max = preAmount;
}
return max;
};