标签:offer 算法 return 使用 subarray else lan 描述 最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
使用动态规划,对于输入的数组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;
}
标签:offer 算法 return 使用 subarray else lan 描述 最大和
原文地址:https://www.cnblogs.com/keke-coding/p/13587391.html