最大子序和
题目说明
给定一个整数数组 ·nums· ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例
个人思路
抽象实现
dp[i]
表示以num[i]
为结尾的情况下,nums[0: i + 1]
最大子序和- 计算
dp[i]
的公式
for i in range(0, len_nums):
dp[i] = max(nums[i], dp[i - 1] + nums[i])
具体实现
/**
* 计算最大子数组的和
* @param data
* @returns {number}
*/
function maxSubArray(data){
let dp = new Array(data.length).fill(Number.MIN_VALUE);
dp[0] = data[0]
for (let i=1;i<data.length;i++) {
dp[i] = Math.max(dp[i - 1] + data[i], data[i])
}
let max = Number.MIN_VALUE;
dp.forEach(value => max = Math.max(max, value))
return max
}
优化
- 当前的时间复杂度和空间复杂度均为O(N),但其实dp并不需要维护一个O(N)的数组,所以有优化代码如下
/**
* 计算最大子数组的和(优化空间复杂度)
* @param data
* @returns {number}
*/
function maxSubArray2(data){
let res, dp;
res = dp = data[0]
for (let i=1;i<data.length;i++) {
dp = Math.max(dp + data[i], data[i])
res = Math.max(res, dp)
}
return res
}
官方解答
- 动态规划
- 分治