最大子序和
大约 1 分钟
最大子序和
题目描述
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
解题步骤
为了找到具有最大和的连续子数组,我们可以使用动态规划的思想来解决问题。
定义状态:我们可以将问题转化为以每个元素结尾的连续子数组的最大和。令
dp[i]
表示以第i
个元素结尾的连续子数组的最大和。初始状态:根据题目的约束,以第一个元素结尾的连续子数组的最大和就是第一个元素本身。即
dp[0] = nums[0]
。状态转移方程:对于第
i
个元素,我们有两种选择:将其加入前一个子数组中或以当前元素为起点开始新的子数组。如果我们选择将其加入前一个子数组中,那么最大和为dp[i-1] + nums[i]
;如果我们选择以当前元素为起点开始新的子数组,那么最大和为nums[i]
。因此,状态转移方程为dp[i] = max(dp[i-1] + nums[i], nums[i])
。最终解:问题的解即为所有连续子数组的最大和中的最大值,即
max(dp)
。
下面是使用动态规划解决最大子序和问题的算法框架:
function maxSubArray(nums) {
const n = nums.length;
if (n === 0) {
return 0;
}
const dp = new Array(n);
dp[0] = nums[0];
let maxSum = dp[0];
for (let i = 1; i < n; i++) {
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
maxSum = Math.max(maxSum, dp[i]);
}
return maxSum;
}