- 题目:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
- 动态规划
- 状态方程:
dp[i]表示数组中到第i位时的最大子序和 - 转移方程:
dp[i]的值取决于数组第i位选择加入之前的子序列,还是从它开始重新创建一个子序列,这要看第i位的大小和之前的子序列和加上第i位的大小哪个更大。
如果第i位加上了之前的子序列和比本身还小,那就没有必要加入之前的子序列了,直接从它开始一个新的序列,反之可以加入子序列。
dp[i] = dp[i - 1] + nums[i] if dp[i - 1] + nums[i] > nums[i]
dp[i] = nums[i] if dp[i - 1] + nums[i] < nums[i]
在代码中可以用一个变量dpMax表示dp数组,因为我们只需要其中最大的数
public int maxSubArray(int[] nums){
int result = nums[0];
int dpMax = nums[0];
for (int i = 1; i < nums.length; i++){
if (nums[i] > dpMax + nums[i])
dpMax = nums[i];
else
dpMax += nums[i];
result = Math.max(result, dpMax);
}
return result;
}
时间复杂度:O(N)
空间复杂度:O(1)
- 分治方法
方法二:分治