April 18, 2019

152. Maximum Product Subarray

152. Maximum Product Subarray

DP. Space = O(n)

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

Optimize space to O(1):

class Solution {
    public int maxProduct(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int maxProductPre = nums[0];
        int minProductPre = nums[0];
        int max = nums[0];
        int maxProduct;
        int minProduct;
        for (int i = 1; i < nums.length; i++) {
            maxProduct = Math.max(nums[i], Math.max(nums[i] * maxProductPre, nums[i] * minProductPre));
            minProduct = Math.min(nums[i], Math.min(nums[i] * maxProductPre, nums[i] * minProductPre));
            max = Math.max(max, maxProduct);
            maxProductPre = maxProduct;
            minProductPre = minProduct;
        }
        return max;
    }
}
comments powered by Disqus