剑指offer连续子数组最大和
时间:2020-09-11 15:57:45
收藏:0
阅读:40
题目描述
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
算法描述
使用动态规划,对于输入的数组nums[],定义数组dp[nums.length],并且dp[i]表示以num[i]为结尾的子数组的和的最大值,则状态转移方程为
* 如果dp[i-1]<=0,那么代表前面的子数组对后面的影响不大,可以抛弃不算,则dp[i] = nums[i];
* 如果dp[i-1]>0,那么可以将前面的数组纳入考量范畴,dp[i] = dp[i-1] + nums[i];
则最终返回的结果为dp[]数组中的最大值,并且对应的子数组为最大值向前直到不为0或负数的相对应的下标,例如
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|---|
nums | -2 | 1 | -3 | 4 | -1 | 2 | 1 | -5 | 4 |
dp | -2 | 1 | -2 | 4 | 3 | 5 | 6 | 1 | 5 |
则返回最大和为6,对应下标为3到6的子数组
代码
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
int output = Integer.MIN_VALUE;
for(int i = 0;i<nums.length;i++){
if(i==0)dp[i] = nums[0];
else{
if(dp[i-1]<=0)dp[i] = nums[i];
if(dp[i-1]>0)dp[i] = dp[i-1] + nums[i];
}
output = Math.max(dp[i],output);
}
return output;
}
评论(0)