📅  最后修改于: 2023-12-03 15:40:14.209000             🧑  作者: Mango
最大乘积子数组是指在一个给定数组中,找到连续的一组子数组,使得这个子数组中元素的乘积最大。我们可以使用动态规划的方法来解决这个问题。
我们可以定义两个数组:max
和min
。其中max[i]
表示以第i
个元素结尾的乘积最大的连续子数组的乘积,min[i]
表示以第i
个元素结尾的乘积最小的连续子数组的乘积。对于数组中的第一个元素,max[0]
和min[0]
均为该元素的值。我们可以通过以下递推式来计算出其他元素的值:
max[i] = max(max[i-1]*nums[i], nums[i])
,min[i] = min(min[i-1]*nums[i], nums[i])
;max[i] = max(min[i-1]*nums[i], nums[i])
,min[i] = min(max[i-1]*nums[i], nums[i])
;max[i] = min[i] = 0
。最终,max
数组中的最大值即为所求。
下面是Java程序的实现:
public static int maxProduct(int[] nums) {
int n = nums.length;
int[] max = new int[n];
int[] min = new int[n];
max[0] = nums[0];
min[0] = nums[0];
int maxProduct = nums[0];
for (int i = 1; i < n; i++) {
if (nums[i] > 0) {
max[i] = Math.max(max[i-1]*nums[i], nums[i]);
min[i] = Math.min(min[i-1]*nums[i], nums[i]);
} else if (nums[i] < 0) {
max[i] = Math.max(min[i-1]*nums[i], nums[i]);
min[i] = Math.min(max[i-1]*nums[i], nums[i]);
} else {
max[i] = min[i] = 0;
}
maxProduct = Math.max(maxProduct, max[i]);
}
return maxProduct;
}
假设数组的长度为n,时间复杂度为O(n),空间复杂度为O(n)。
以下是一些示例:
[2,3,-2,4]
,输出:6
(对应的连续子数组为[2,3]
);[-2,0,-1]
,输出:0
(对应的连续子数组为[0]
)。