152. 乘积最大子数组

思路:动态规划,假设当前最大值为imax,显然imax=Math.max(imax*nums[i],nums[i])。因为存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值imin,imin = min(imin * nums[i], nums[i])当负数出现时则imax与imin进行交换再进行下一步计算
假如序列为1,2,3,-1, 10,1
imax:1,2,6, 1 -1 10 10
imin:1,1,1, 6 -1 -10 -10
假如到了-1这个元素,-1小于0,交换imax与imin,然后再求imax imin
class Solution {
public int maxProduct(int[] nums) {
int max=Integer.MIN_VALUE;
int imax=1;
int imin=1;
for(int i=0;i<nums.length;i++)
{
if(nums[i]<0)
{
int tmp=imin;
imin=imax;
imax=tmp;
}
imax = Math.max(imax*nums[i], nums[i]);
imin = Math.min(imin*nums[i], nums[i]);
max = Math.max(max, imax);
}
return max;
}
}

浙公网安备 33010602011771号