LeetCode152.乘积最大子数列
题目
分析
题目中有几个关键点:
- 整数数组:意味着没有小数,不考虑0的情况下相乘的的绝对值肯定是变大或者不变的。
但是由于存在负数,导致最大值可能从正的产生也可能从负的产生,所以就需要在遍历的时候都进行记录。
- 动态规划:
- 这个问题需要我们遍历数组时计算当前的最大值,并不断更新
- 由于上面的分析我们可以得知最大值肯定是前面的值乘以当前值或者就是当前值
- 可以得知这样的状态转移方程:
- imax=max(imax*nums[i],nums[i])
- 当负数出现时imax和imin进行交换再进行下一步操作。
代码实现
public static int maxProduct(int[] nums) {
int max=Integer.MIN_VALUE;
int imax=1,imin = 1;
for(int i=0;i<nums.length;i++){
// 不借助第三方进行交换
if(nums[i]<0){
imax=imax+imin;
imin=imax-imin;
imax=imax-imin;
}
imax=Math.max(imax*nums[i],nums[i]);
imin=Math.min(imin*nums[i],nums[i]);
max=Math.max(max,imax);
}
return max;
}