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;
    }
}

  

原文地址:https://www.cnblogs.com/lzh1043060917/p/12921385.html