剑指offer面试题42:连续子数组的最大和(动态规划,思路和实现都要复习)

书中提供了两种方法,第一种是从前往后遍历数组,并且进行相加的运算,当遇到负数时,保存之前的运算结果,并且继续相加,若又出现了正数,则与当前的相加值进行比较,选择较大的值,与接下来的正数相加,若又遇到负数,重复上述步骤。这种方法的代码好写。

第二种方法是动态规划。

动态规划,用函数f(i)表示以第i个数字结尾的子数组的最大和,我们需要求出max[f(i)],可以用如下递归公式求f(i)

f(i) = pData[i]  (i=0 或者 f(i-1) <= 0)

f(i) = f(i-1) + pData[i] (i!=0 或者 f(i-1) >0)

不过这两种方法对应的代码一致

class Solution {
    public int maxSubArray(int[] nums) {
        int res_max = nums[0];
        for(int count = 1;count<nums.length;count++){
            nums[count] += Math.max(nums[count-1],0);
            res_max = Math.max(res_max,nums[count]);
        }
        return res_max;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/114435477