// GoLang
func maxProduct(nums []int) int {
var length int = len(nums)
var res int = nums[0]
var dpMax, dpMin []int = make([]int, length), make([]int, length)
var getMax func(a, b int) int
var getMin func(a, b int) int
getMax = func(a, b int) int{
if a>=b{ return a }else{ return b }
}
getMin = func(a, b int) int{
if a<=b{ return a }else{ return b }
}
dpMax[0], dpMin[0] = nums[0], nums[0]
for k, v := range(nums){
if k==0{ continue }
dpMax[k] = getMax(v, dpMax[k-1]*v)
dpMax[k] = getMax(dpMax[k], dpMin[k-1]*v)
dpMin[k] = getMin(v, dpMin[k-1]*v)
dpMin[k] = getMin(dpMin[k], dpMax[k-1]*v)
res = getMax(res, dpMax[k])
}
return res
}
// Java
class Solution {
public int maxProduct(int[] nums) {
int key_max, key_min, res;
key_min = nums[0];
key_max = nums[0];
res = nums[0];
for(int i=1; i<nums.length; i++){
int tmp_max, tmp_min;
tmp_max = Math.max(key_max*nums[i], key_min*nums[i]);
tmp_max = Math.max(tmp_max, nums[i]);
tmp_min = Math.min(key_max*nums[i], key_min*nums[i]);
tmp_min = Math.min(tmp_min, nums[i]);
key_max = tmp_max;
key_min = tmp_min;
res = Math.max(key_max, res);
}
return res;
}
}