解题思路:
DP
维护两个数组min[]和max[]
max[i]表示0-i之间肯定包含第i位数的最大值;
min[i]表示0-i之间肯定包含第i位数的最小值;
则第i位的最大值从(max[i-1]*nums[i],min[i-1]*nums[i],nums[i])中进行选择
同时需要维护一个max值,用于记录dp过程中的最大值,即max[]数组中的最大值。
可以优化不使用数组来记录临时量,而使用5个变量即可。
提交代码:
class Solution {
public int maxProduct(int[] nums) {
if(nums==null||nums.length<1) return 0;
int preMax=nums[0],curMax=nums[0];
int preMin=nums[0],curMin=nums[0];
int max=nums[0];
for(int i=1;i<nums.length;i++) {
curMax=Math.max(preMax*nums[i],preMin*nums[i]);
curMax=Math.max(curMax, nums[i]);
curMin=Math.min(preMax*nums[i],preMin*nums[i]);
curMin=Math.min(curMin, nums[i]);
max=Math.max(max, curMax);
preMax=curMax;
preMin=curMin;
}
return max;
}
}