152. 乘积最大子数组
查看题目中等
数组
低频
解法一:动态规划
时间复杂度:O(n) | 空间复杂度:O(1) | 推荐使用
动画演示
准备就绪 - 输入数组值(用逗号分隔),然后点击开始
动画结果
点击开始按钮查看动画结果
代码实现
class Solution {
public int maxProduct(int[] nums) {
// 初始化全局最大值、当前最大值和当前最小值
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和imin
imax = Math.max(imax * nums[i], nums[i]);
imin = Math.min(imin * nums[i], nums[i]);
// 更新全局最大值
max = Math.max(max, imax);
}
return max;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
初始化全局最大值、当前最大值和当前最小值遍历数组,对于每个元素: 如果当前元素是负数,交换当前最大值和当前最小值 更新当前最大值为 max(当前最大值*当前元素, 当前元素) 更新当前最小值为 min(当前最小值*当前元素, 当前元素) 更新全局最大值为 max(全局最大值, 当前最大值)返回全局最大值