class Solution {
/*当nums[i]<0,用imin(以nums[i-1]结尾的最小的子数组乘积)乘以nums[i],然后和nums[i]比较大小,得到以nums[i]结尾的最大的子数组乘积。
imax保存以nums[i-1]结尾的最大的子数组乘积
imin保存以nums[i-1]结尾的最小的子数组乘积
*/
public int maxProduct(int[] nums) {
int imax=1,imin=1,max=Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
if(nums[i]>0){
imax=Math.max(nums[i],imax*nums[i]);
imin=Math.min(nums[i],imin*nums[i]);
}else{
int tmp=imax;//用tmp保存imax,否则会被覆盖掉。
imax=Math.max(nums[i],imin*nums[i]);
imin=Math.min(nums[i],tmp*nums[i]);
}
max=Math.max(max,imax);
}
return max;
}
}
动态规划 中等 leetcode 152. 乘积最大子序列
最新推荐文章于 2024-05-27 20:42:21 发布