剑指 Offer 42. 连续子数组的最大和
题目:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
解法:动态规划
思路:最优子结构:nums数组一个一个变短;设数学符号:r[i]表示以nums[i]结尾的最大子数组和;状态转移方程:如果r[i-1]<=0,则r[i] = nums[i],否则r[i] = r[i-1]+nums[i]
代码:
class Solution {
public int maxSubArray(int[] nums) {
int len = nums.length;
int r[] = new int[len]; //r[i]表示以i为结尾的最大子数组和
r[0] = nums[0];
int maxSum = nums[0];
//自底向上
for(int i=1;i<len;i++){
// if(r[i-1]<=0){
// r[i] = nums[i];
// } else{
// r[i] = r[i-1]+nums[i];
// }
r[i] += Math.max(r[i - 1], 0); //妙啊
maxSum = Math.max(maxSum,r[i]); //以谁结尾是最大
}
return maxSum;
}
}

浙公网安备 33010602011771号