思路
代码
/**
* 120ms
*/
public int maxProduct(int[] nums) {
int ans=Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
int mult=1;
for(int j=i;j<nums.length;j++){
mult*=nums[j];
ans=Math.max(ans, mult);
}
}
return ans;
}
思路
imax=Math.max(imax*nums[i],nums[i])
imin=Math.min(imin*nums[i],nums[i])
代码
/**
* 2ms
* 动态规划
*/
public int maxProduct2(int[] nums){
//imax为当前最大值
int max=Integer.MIN_VALUE,imax=1,imin=1;
for(int i=0;i<nums.length;i++){
//若当前遍历值为负数 则imax与imin先交换 再进行计算
if(nums[i]<0){
int tmp=imax;
imax=imin;
imin=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/yh-simon/p/12912854.html