最大子数组和(Maximum Subarray Sum)问题是求一个数组中的最大子数组和。
我们可以使用动态规划实现最大子数组和算法:
public int maxSubArray(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
dp[0] = nums[0];
int maxSum = dp[0];
for (int i = 1; i < n; i++) {
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
maxSum = Math.max(maxSum, dp[i]);
}
return maxSum;
}
算法流程:
- 初始化dp数组和maxSum。dp[i]表示以nums[i]结尾的最大子数组和,maxSum表示全局最大子数组和。
- dp[0] = nums[0]。最大子数组和至少包含第一个数。
- 对于其他位置i,dp[i]为两个值中的最大值:
- dp[i – 1] + nums[i]:将当前数添加到以前一个数结尾的最大子数组和。
- nums[i]:当前数单独作为最大子数组和。
- maxSum为dp中的最大值,用来记录全局最大子数组和。
- 重复步骤3和4,最终maxSum为最大子数组和,返回maxSum。
时间复杂度 O(n),空间复杂度 O(n)。
所以,最大子数组和的关键是:
- 定义dp数组,dp[i]表示以nums[i]结尾的最大子数组和。maxSum记录全局最大子数组和。
- dp[i]为两者中的最大值:dp[i – 1] + nums[i]或nums[i]。前者代表将当前数加入前面最大子数组和,后者代表当前数单独构成最大子数组和。
- maxSum始终记录dp中的最大值,最终为最大子数组和。
- 重复上述步骤计算dp数组,maxSum即为最终结果。