在刷LeetCode,遇到动态规划的题目就头大,边做边详细记录下~难度比较大,先从easy难度开始
53. Maximum Subarray
最大子数组,给定一个整数数组nums,找到其中和最大的连续的子数组,并返回它们相加的和。例子:
Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.
该题解答的思想主要为用两个变量,一个变量maxSoFar记录全局目前为止的最大和,另一个变量maxEndingHere记录该串目前为止最大和,若maxEndingHere超过了maxSoFar,则更新maxSoFar的值为maxEndingHere的值。具体可见下面的例子
cbmbbz的解法
public static int maxSubArray(int[] A) {
int maxSoFar=A[0], maxEndingHere=A[0];//maxSoFar为到目前为止,出现过的连续子数组中和的最大值,maxEndingHere为当前串截止到当前数字之前和的最大值
for (int i=1;i<A.length;++i){
maxEndingHere= Math.max(maxEndingHere+A[i],A[i]);//比较当前数字是加上该串之前的数字更大,还是不加更大,
//其实也就是判断该数字前的和是正数还是负数,如果是正数,就加上,是负数会拖累自己,就甩掉之前的从头开始
maxSoFar=Math.max(maxSoFar, maxEndingHere);//看看当前串的值有没有超过最大值,超过了则对最大值进行更新。
}
return maxSoFar;
}