Algorithm 用Kadanes算法求最大乘积子阵的范围

Algorithm 用Kadanes算法求最大乘积子阵的范围,algorithm,kadanes-algorithm,Algorithm,Kadanes Algorithm,应用Kadane算法获得最大乘积子数组似乎很棘手。虽然我能够得到最大乘积,但我并没有真正得到最大乘积子阵列的正确范围 解释了获得最大乘积的方法,但我不知道如何获得子阵列的范围 有人能帮我理解射程问题吗?这是一个标准的面试问题,我想确保我理解产品案例的逻辑,而不是说可以修改最大和子阵列来回答最大产品子阵列案例 谢谢 您提供的链接似乎假设所有元素都是正的。然而,在我看来,这不是一个安全的假设。我有返回代码来获取最大乘积的子数组。我使用了算法中使用的相同逻辑。代码似乎适用于各种输入。如果有问题,请告诉

应用Kadane算法获得最大乘积子数组似乎很棘手。虽然我能够得到最大乘积,但我并没有真正得到最大乘积子阵列的正确范围

解释了获得最大乘积的方法,但我不知道如何获得子阵列的范围

有人能帮我理解射程问题吗?这是一个标准的面试问题,我想确保我理解产品案例的逻辑,而不是说可以修改最大和子阵列来回答最大产品子阵列案例


谢谢

您提供的链接似乎假设所有元素都是正的。然而,在我看来,这不是一个安全的假设。我有返回代码来获取最大乘积的子数组。我使用了算法中使用的相同逻辑。代码似乎适用于各种输入。如果有问题,请告诉我

public static int[] getMaxSubArray(int []arr){

    int maxEndingHere = arr[0], maxSoFar = arr[0], startIndex =0, start =0,end=0;

    for(int i=1;i<arr.length;i++){

        if(maxEndingHere<0){
            maxEndingHere = arr[i];
            startIndex = i;         
        }else{          
            maxEndingHere *= arr[i];
        }           
        if(maxEndingHere>=maxSoFar){
            maxSoFar = maxEndingHere;
            start = startIndex;
            end = i;
        }   
    }       
    if(start<=end)
        return Arrays.copyOfRange(arr, start, end+1);

    return null;
}
样本输入={6,3,-10,0,2} 输出={6,3}
样本输入={2,1,-3,4,-1,2,1,-5,4} 输出={4} 样本输入={1,-2,-9,-6} 输出={-1}
基本上有三种情况:

目前的数字是+ve 目前的数字是-ve 目前的数字是0 您需要有两个变量:

到目前为止保持最小值的最小值

最大值,该值至今保持最大值

现在,对于情况3,最小值和最大值将重置为1

对于情况1:max将是max*a[i],min将是min*a[i]和1的最小值

对于情况2:max将是a[i]*min和1中的最大值,但min值将是max*a[i]

代码如下:

private static int getMaxProduct(int[] a){
    int minCurrent = 1, maxCurrent = 1, max = Integer.MIN_VALUE;
    for (int current : a) {
        if (current > 0) {
            maxCurrent = maxCurrent * current;
            minCurrent = Math.min(minCurrent * current, 1);
        } else if (current == 0) {
            maxCurrent = 1;
            minCurrent = 1;
        } else {
            int x = maxCurrent;
            maxCurrent = Math.max(minCurrent * current, 1);
            minCurrent = x * current;
        }
        if (max < maxCurrent) {
            max = maxCurrent;
        }
    }
    //System.out.println(minCurrent);
    return max;
}

这不是卡丹的算法,而是与之类似的。样本输入={2,1,-3,4,-1,2,1,-5,4}输出={2,1,-3,4,-1,2,1,-5,4}
private static int getMaxProduct(int[] a){
    int minCurrent = 1, maxCurrent = 1, max = Integer.MIN_VALUE;
    for (int current : a) {
        if (current > 0) {
            maxCurrent = maxCurrent * current;
            minCurrent = Math.min(minCurrent * current, 1);
        } else if (current == 0) {
            maxCurrent = 1;
            minCurrent = 1;
        } else {
            int x = maxCurrent;
            maxCurrent = Math.max(minCurrent * current, 1);
            minCurrent = x * current;
        }
        if (max < maxCurrent) {
            max = maxCurrent;
        }
    }
    //System.out.println(minCurrent);
    return max;
}