152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字)。
示例 1:
输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2:
输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-product-subarray 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
使用动态规划的解题思路,递推出最终结果.
- 遍历数组时计算出最大值,不断更新,递推最终结果
- res为最终结果, max为以当前元素结尾的子数组的最大乘积,min为以当前元素结尾的子数组的最小乘积
- 由于存在负数,所以要维护一个最小值,因为负数乘积可能变为一个最大值。
代码如下:
public static int maxProduct(int[] nums) {
if (nums.length == 0) return 0;
if (nums.length == 1) return nums[0];
// 最终结果
int res = nums[0];
// 以i结尾的子数组的最大乘积
int max = nums[0];
// 以i结尾的子数组的组小乘积
int min = nums[0];
for (int i = 1; i < nums.length; i++){
int tmp = max;
max = Math.max(Math.max(max * nums[i],nums[i]),min * nums[i]);
min = Math.min(Math.min(tmp * nums[i],nums[i]),min * nums[i]);
res = Math.max(res,max);
}
return res;
}
时间复杂度: O(N)
空间复杂度: O(1)