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