var maxSubArray = function (nums) { let len = nums.length; let maxSum = -Infinity; for (let i = 0; i < len; i++) { for (let j = i; j < len; j++) { let thisSum = 0; for (let k = i; k <= j; k++) { thisSum += nums[k]; }
maxSum = Math.max(thisSum, maxSum); } }
return maxSum; };
三层 for 循环,很明显时间复杂度为 O(n3)。这种解法在 leetcode 判断会超出时间限制。
解法二
对解法一进行优化。在第三层 for 循环计算子数组和时,对于相同的 i, 不同的 j,只要在 j - 1 次循环的基础上累加一项即可。因此,可以将三层 for 循环去掉。时间复杂度为 O(n2)
var maxSubArray = function (nums) { let len = nums.length; let maxSum = -Infinity; for (let i = 1; i < len; i++) { let thisSum = 0; for (let j = i; j < len; j++) { thisSum += nums[j];
var maxSubArray = function (nums) { let maxSum = nums[0]; let thisSum = 0; for (const num of nums) { if (thisSum > 0) { thisSum += num; } else { thisSum = num; } maxSum = Math.max(sum, maxSum); } return maxSum; };
解法四
看下官方题解,用 Math.max() 方法简化了判断 sum 是否大于 0 的过程,看起来更简洁一些:
var maxSubArray = function (nums) { let len = nums.length; let maxSum = nums[0]; let pre = 0; nums.forEach(num => { pre = Math.max(pre + num, num); maxSum = Math.max(pre, maxSum) }) return maxSum; }