思路:
首先我们设立一个max 和 min 数组,这两个数组的长度和nums 一致。
max[ i ] 和 min [i] 分别表示以nums[ i ] 结尾的连续子数组乘积的最大值和最小值。
max[0] = min[0] = nums[0]。
max[ i +1] = max( nums[i] , nums[i]* max[i-1], nums[i]*min[i-1]).
min[ i +1] = min( nums[i] , nums[i]* min[i-1], nums[i]*max[i-1]).
为什么要设max 和 min 呢?举个例子:
[2,3,-1,-8,0]
这种情况
max = [2, 6, -1, 48, 0 ]
min = [2, 3, -6, -8, 0]
我们最后将max从前往后遍历,找到最大值就可以了。
class Solution {
public int maxProduct(int[] nums) {
int[] max = new int[nums.length];
int[] min = new int[nums.length];
max[0] = nums[0];
min[0] = nums[0];
int m = nums[0];
for(int i=1;i<nums.length;i++)
{
int l = nums[i];
int mm = nums[i]*min[i-1];
int MM = nums[i]*max[i-1];
int[] a = {mm,MM,l};
Arrays.sort(a);
max[i] = a[2];
min[i] = a[0];
if(max[i]>m)
m = max[i];
}
return Math.max(m,nums[nums.length-1]);
}
}