152. Maximum Product Subarray

Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.

Example 1:

Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.

Example 2:

Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
class Solution {
    public int maxProduct(int[] nums) {
        int l = nums.length;
        int max = nums[0];
        int[] dp_min = new int[l];
        int[] dp_max = new int[l];
        dp_min[0] = dp_max[0] = max;
        for(int i = 1; i < l; i++){
            dp_min[i] = Math.min(
            Math.min(nums[i], dp_min[i-1] * nums[i]), nums[i] * dp_max[i-1]);
            dp_max[i] = Math.max(
            Math.max(nums[i] * dp_min[i-1], nums[i] * dp_max[i-1]), nums[i]);
            max = Math.max(max, dp_max[i]);
        }
        return max;
    }
}

转自 https://blog.csdn.net/whuwangyi/article/details/39577455

由于负数的存在,需要同时保存当前最大值和当前最小值,所以需要维护两个DP表,可以分别表示为dp_min和dp_max。所以即为dp_max里的最大值。

有时候做题目应该有一种大局观,从细节中解脱出来。这点类似于做物理题时,不一定非要用动力学原理弄清整个过程和每个细节,有时候用简单的从功和能的角度,只关注最终状态也可以顺利解题。这题里需要维护的当前最大值和当前最小值,都是在dp_min[i-1] * A[i],dp_max[i] * A[i],和A[i]这三者里面取一即可。有了这个只关乎最终状态,不关乎过程细节的结论,解题过程可以大大简化。
---------------------
作者:SciPioneer
来源:CSDN
原文:https://blog.csdn.net/whuwangyi/article/details/39577455
版权声明:本文为博主原创文章,转载请附上博文链接!

 

----------二刷----------

DP

class Solution {
    public int maxProduct(int[] nums) {
        int[] max = new int[nums.length];
        int[] min = new int[nums.length];
        max[0] = min[0] = nums[0];
        int res = max[0];
        for(int i = 1; i < nums.length; i++){
            if(nums[i] > 0){
                max[i] = Math.max(nums[i], max[i-1] * nums[i]);
                min[i] = Math.min(nums[i], min[i-1] * nums[i]);
            }
            else if(nums[i] < 0){
                max[i] = Math.max(min[i-1] * nums[i], nums[i]);
                min[i] = Math.min(max[i-1] * nums[i], nums[i]);
            }
            res = Math.max(res, max[i]);
        }
        return res;
    }
}

 

posted @ 2019-03-26 06:40  Schwifty  阅读(119)  评论(0编辑  收藏  举报