描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
分析
寻找最大的连续子序列,就应该找到每一个以nums[i]为结尾的最大连续子序列
- dp[i]
dp[i]:表示以nums[i-1]为结尾的最大连续子序列和。(为什么是i-1而不是i,是为了方便从nums[0]开始遍历,留下初始化空间) - 动态转移方程
dp[i] = Math.max(dp[i-1] + nums[i-1],nums[i-1]);
以nums[i]为结尾的最大连续子序列,即子序列一定包含nums[i],需不需要nums[i]前面的元素取决于dp[i-1]是不是正的,能不让以nums[i]为结尾的子序列变得更大。 - 初始化
dp[0]=0,这样dp[1]一定等于nums[0],从nums[0]开始遍历就没问题,dp[0]没有实际含义,只是为了方便从nums[0]计算动态转移方程。
class Solution {
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length+1];
dp[0] = 0;
int max = nums[0];
for(int i = 1; i <= nums.length; i++){
dp[i] = Math.max(dp[i-1] + nums[i-1],nums[i-1]);
max = Math.max(max,dp[i]);
}
return max;
}
}