本题的难点在于:存在部分负数的情况,我们最开始想到的就是维护一个局部最大值imax,然后将Imax和当前值想乘,同时比较,谁大取谁,但是这里面存在负数,所以就需要维护一个最小值,因为一个较大的值乘以负数,会变为最小的值,所以维护一个imin,只要当前的这个元素小于0,就交换imax和imin,所以imax始终为当前乘积的最大值,然后和全局res比较,取最大值。
代码如下:
class Solution {
public int maxProduct(int[] nums) {
// 动态规划,
int res = Integer.MIN_VALUE;
int imax = 1;
int imin = 1;
for(int x: nums){
if(x<0){
int t = imax;
imax = imin;
imin = t;
}
imax = Math.max(imax*x, x);
imin = Math.min(imin*x, x);
res = Math.max(res, imax);
}
return res;
}
}
元宵节快乐!