题目简述:
给你一个整数数组
nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。
题目链接:152. 乘积最大子数组
这个问题很显然是一个动态规划问题,但有趣的是相比于更平凡、更基础的只维护一个
假设我们只设
要解决这个问题也很简单,同时维护一个表示
Base case: $$ \mathrm{maximum}[0]=\mathrm{minimum}[0]=\text{nums}[0] $$
时间复杂度为
class Solution {
public int maxProduct(int[] nums) {
int[] maximum = new int[nums.length];
int[] minimum = new int[nums.length];
maximum[0] = nums[0];
minimum[0] = nums[0];
int res = nums[0];
for (int i = 1; i < nums.length; i++) {
maximum[i] = Math.max(Math.max(nums[i], nums[i] * maximum[i - 1]), nums[i] * minimum[i - 1]);
minimum[i] = Math.min(Math.min(nums[i], nums[i] * minimum[i - 1]), nums[i] * maximum[i - 1]);
res = Math.max(res, maximum[i]);
}
return res;
}
}时间复杂度为
class Solution {
public int maxProduct(int[] nums) {
int maximum = nums[0], minimum = nums[0], res = nums[0];
for (int i = 1; i < nums.length; i++) {
int tmp = maximum;
maximum = Math.max(Math.max(nums[i], nums[i] * maximum), nums[i] * minimum);
minimum = Math.min(Math.min(nums[i], nums[i] * minimum), nums[i] * tmp);
res = Math.max(res, maximum);
}
return res;
}
}