数组中连续子数组的最大乘积(LeetCode152. 乘积最大子数组)

题目

解析

在了解连续子数组最大乘积之前,请先参考数组中连续子数组的最大和(LeetCode53. 最大子序和)
比起连续子数组最大和只记录当前元素加和的结果sum,连续子数组最大乘积中需要记录的是当前元素乘积的最大值max和最小值min,这是由于最大的乘积可能是最大的正值,也可能是最大的负值(也就是最小值),再与当前元素乘积得到的。与连续子数组最大和相同的需要记录当前元素的最大乘积result。假设当前数组nums,遍历到下标为i的元素上,计算max*nums[i],min*nums[i]和nums[i]中的最大值max和最小值min,更新最大值max和最小值min。如果最大值max大于result值,更新result记录下这个更大的值。

代码

public int maxProduct(int[] nums) {
    int max = nums[0]; int min = nums[0]; int result = nums[0];
    for(int i = 1; i < nums.length; ++i){
        int max0 = max; int min0 = min;
        max = maxThreeNums(max0 * nums[i], min0 * nums[i], nums[i]);
        min = minThreeNums(max0 * nums[i], min0 * nums[i], nums[i]);
        if(max > result){
            result = max;
        }
    }
    return result;
}

private int maxThreeNums(int a, int b, int c){
    return Math.max(Math.max(a, b), c);
}

private int minThreeNums(int a, int b, int c){
    return Math.min(Math.min(a, b), c);
}

推荐阅读更多精彩内容