📜  最大乘积子数组的Java程序(1)

📅  最后修改于: 2023-12-03 15:40:14.209000             🧑  作者: Mango

最大乘积子数组的Java程序

最大乘积子数组是指在一个给定数组中,找到连续的一组子数组,使得这个子数组中元素的乘积最大。我们可以使用动态规划的方法来解决这个问题。

算法实现

我们可以定义两个数组:maxmin。其中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])。