Java 打印数组中最大连续乘积的子数组

Java 打印数组中最大连续乘积的子数组,java,arrays,data-structures,Java,Arrays,Data Structures,最大乘积子阵 给定一个包含正整数和负整数的数组,找到最大乘积的子数组。 示例: 输入:arr[]={6,-3,-10,0,2} 输出:子数组为{6,-3,-10} 输入:arr[]={-1,-3,-10,0,60} 输出:子阵列为{60} 输入:arr[]={-2,-3,0,-2,-40} 输出:子数组为{-2,-40} 注意:查找Max乘积就像使用kadane算法一样,我试图重用它来查找子数组,但无法中断查找开始索引的部分,查找结束索引很容易。结束索引是res

最大乘积子阵 给定一个包含正整数和负整数的数组,找到最大乘积的子数组。 示例:

输入:arr[]={6,-3,-10,0,2} 输出:子数组为{6,-3,-10}

输入:arr[]={-1,-3,-10,0,60} 输出:子阵列为{60}

输入:arr[]={-2,-3,0,-2,-40} 输出:子数组为{-2,-40}

注意:查找Max乘积就像使用kadane算法一样,我试图重用它来查找子数组,但无法中断查找开始索引的部分,查找结束索引很容易。结束索引是res
public int maxProductSubArray(int arr[], int len) {

        int res = arr[0];

        int max = arr[0];
        int min = arr[0];

        for (int i = 1; i < len; i++) {

            int temp = max;

            max = Math.max(Math.max(max * arr[i], min * arr[i]), arr[i]);
            min = Math.min(Math.min(temp * arr[i], min * arr[i]), arr[i]);

            res = Math.max(res, max);
        }

        return res;

    }
public int-maxProductSubArray(int-arr[],int-len){
int res=arr[0];
int max=arr[0];
int min=arr[0];
对于(int i=1;i

但无法破解问题找到子阵列。

此问题可以通过分治有效解决

假设您想要解决子阵列的问题
[l,r]
;然后,假设
c=(l+r)/2
解是
[l,c]
中的子数组,或者是
[c+1,r]
中的子数组,或者是包含
c
c+1
的子数组

然后让我们定义一个函数
f(l,r)
返回子段的答案;然后,为了计算这个函数,首先递归调用
f(l,c)
f(c+1,r)
,并选择最大值作为临时答案。然后计算段的乘法
[c,c]
,然后
[c-1,c]
,依此类推(使用[c-k,c]=c-k+1,c]*数组[c-k]
)并计算所有这些段的最大和最小乘法。对
c
[c+1,c+1]
[c+1,c+2]
等)右侧的段执行相同操作,然后,答案将是临时答案,即最大值的乘法或最小值的乘法或最小值与最大值的乘法,反之亦然(如果乘法为负数,则需要最小乘以最大值)。返回这四个值的最大值或临时答案作为函数结果

如果有必要,除了返回乘法函数的值,还可以返回达到这些值的段


此解决方案使用
Θ(n log n)
时间和
Θ(n)
空间。

有几种可能的方法来解决此问题:

  • 蛮力
  • 分而治之
  • 回溯
我只向您展示暴力解决方案。它不是最快的解决方案,但在我看来是最清晰、最容易理解的解决方案:

public class SubArray {

    public static int findMax(int[] num) {

        int max = num[0];
        int start = 0;
        int end = 0;
        for(int i = 0; i < num.length; i++) {   //Iterating over every possible starting position
            for(int j = i; j < num.length; j++) { //Iterating over every possible end position
                int multiply = 1;
                for(int k = i; k <= j; k++) {   //Multiply from start to end
                    multiply *= num[k];
                }
                if(max < multiply) {    //Did we find a new maximum?
                    max = multiply;
                    start = i;
                    end = j;
                }
            }
        }

        System.out.print("The subarray is {");  //Print subarray with highest product
        for(int i = start; i <= end; i++) {
            System.out.print(num[i]);
            if(i < end) {
                System.out.print(", ");
            }
        }
        System.out.println("}");

        return max;
    }

    public static void main(String[] args) {
        int[] array = {6, -3, -10, 0, 2} ;
        int max = findMax(array);
        System.out.println("Maximal product is: " + max);
    }   
}
公共类子阵列{
公共静态int findMax(int[]num){
int max=num[0];
int start=0;
int end=0;
对于(int i=0;i对于(int k=i;k欢迎来到Stackoverflow,请阅读。请特别注意。确保用正确的标签(编程语言、相关技术等)标记您的问题。你在发布一个好问题上投入的精力越大:一个容易阅读、理解的问题,它吸引相关人员的可能性越高,你会更快地得到帮助。祝你好运!你能建议我发布的内容有什么错吗?我错过了哪里?标签和问题陈述都很清楚。是的,我做了sear在发布这个问题之前,ch stack和google。现在我明白你的意思了。我已经编辑并把我尝试过的东西和我的建议放在stuckjust建议的地方。请查看上面链接提供的解决方案。你只需要做一些小的更改就可以达到你的目标。