package com.interview.array;
/**
* Date 04/`7/2016
* @author Tushar Roy
*
* Find the contiguous subarray within an array (containing at least one number) which has the largest product.
*
* Time complexity is O(n)
* Space complexity is O(1)
*
* http://www.geeksforgeeks.org/maximum-product-subarray/
* https://leetcode.com/problems/maximum-product-subarray/
*/
public class MaxProductSubarray {
public int maxProduct(int[] nums) {
int min = 1;
int max = 1;
int maxSoFar = nums[0];
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
max = max * nums[i];
min = Math.min(min * nums[i], 1);
maxSoFar = Math.max(maxSoFar, max);
} else if (nums[i] == 0) {
min = 1;
max = 1;
maxSoFar = Math.max(maxSoFar, 0);
} else {
int t = max * nums[i];
maxSoFar = Math.max(maxSoFar, min * nums[i]);
max = Math.max(1, min*nums[i]);
min = t;
}
}
return maxSoFar;
}
public static void main(String args[]){
MaxProductSubarray mps = new MaxProductSubarray();
int input[] = {-6, -3, 8, -9, -1, -1, 3, 6, 9, 0, 3, -1};
System.out.println(mps.maxProduct(input));
}
}