152. Maximum Product Subarray

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.





https://www.youtube.com/watch?v=AtzfZHb35YI

// correct 

class Solution {
    public int maxProduct(int[] nums) {
        // initialize maxToCur, minToCur and maxProduct 
        // maxTocur = max(maxToCur * cur, minToCur * cur, cur) 
        // minToCur = min(maxToCur * cur, minToCur * cur, cur)
        // maxProdcut = max(maxProduct, maxToCur)
        // return maxProduct 
        
        int prevMax = nums[0];
        int prevMin = nums[0];
        int maxProduct = nums[0];
        
        for(int i = 1; i < nums.length; i++){
            int cur = nums[i];
            
            int maxToCur = Math.max(Math.max(prevMax * cur, prevMin * cur), cur);
            // since the maxCur is changed after the above step, we use two more vars called prevMax, prevMin 
            int minToCur = Math.min(Math.min(prevMax * cur, prevMin * cur), cur);
            maxProduct = Math.max(maxProduct, maxToCur);
            
            prevMax = maxToCur;
            prevMin = minToCur;
        }
        return maxProduct;
        
    }
}


// wrong 

class Solution {
    public int maxProduct(int[] nums) {
        // initialize maxToCur, minToCur and maxProduct 
        // maxTocur = max(maxToCur * cur, minToCur * cur, cur) 
        // minToCur = min(maxToCur * cur, minToCur * cur, cur)
        // maxProdcut = max(maxProduct, maxToCur)
        // return maxProduct 
        
        int maxToCur = nums[0];
        int minToCur = nums[0];
        int maxProduct = nums[0];
        
        for(int i = 1; i < nums.length; i++){
            int cur = nums[i];
            maxToCur = Math.max(Math.max(maxToCur * cur, minToCur * cur), cur);
            // since the maxCur is changed after the above step, we use two more vars called prevMax, prevMin 
            minToCur = Math.min(Math.min(maxToCur * cur, minToCur * cur), cur);
            maxProduct = Math.max(maxProduct, maxToCur);
        }
        return maxProduct;
        
    }
}

 

posted on 2018-09-20 18:06  猪猪&#128055;  阅读(93)  评论(0)    收藏  举报

导航