【152. 乘积最大子数组】中等题
题目描述
给你一个整数数组 nums
,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
解法:动态规划
这道题我们可以利用动态规划的思路,每次计算出以当前下标为结尾的最大子数组的乘积。
不过在这个题中我们需要注意的是,如果当前这个数为负数时,和前面子数组的负数乘积相乘也可能得到最大值。因此还需要用一个数组来保存最小的子数组的乘积,以便在每次计算的时候把这种情况也考虑进去。
最终所求的乘积最大子数组就是以每个数为结尾的最大乘积中的最大值。
具体代码如下(应该不难理解):
class Solution {
public int maxProduct(int[] nums) {
int[] dp = new int[nums.length];
int[] dpMin = new int[nums.length];
dp[0] = nums[0];
dpMin[0] = nums[0];
int res = nums[0];
for (int i = 1; i < nums.length; i++) {
dp[i] = Math.max(nums[i], Math.max(dp[i-1]*nums[i], dpMin[i-1]*nums[i]));
dpMin[i] = Math.min(nums[i], Math.min(dp[i-1]*nums[i], dpMin[i-1]*nums[i]));
res = Math.max(res , dp[i]);
}
return res;
}
}