最大乘积可以由正数乘正数或者负数乘负数得到,所以在扫描过程中需要记录两个数值,一个最大值(max),一个最小值(min)。
如果当前元素大于等于0,那么通过比较max*nums[i]和nums[i]的大小就可以得到到i为止的最大乘积子序列。
如果当前元素小于0,通过比较min*nums[i]和nums[i]的大小就可以得到到i为止的最大乘积子序列。
所以可以得到状态转移方程为:
当nums[i]>=0时
当nums[i]<0时
注意min里面用到的max不是上一步计算得到的max,而是上一次得到的max。
代码:
class Solution {
public static int maxProduct(int[] nums) {
final int length = nums.length;
int max = nums[0],min = nums[0],result = nums[0];
if (length == 1){
return result;
}
for (int i = 1; i < length; i++) {
if (nums[i] >= 0){
max = Math.max(max * nums[i], nums[i]);
min = Math.min(min * nums[i], nums[i]);
}else {
int temp = max;
max = Math.max(min * nums[i], nums[i]);
min = Math.min(temp * nums[i], nums[i]);
}
result = Math.max(result, max);
}
return result;
}
}