Algorithm 用Kadanes算法求最大乘积子阵的范围
应用Kadane算法获得最大乘积子数组似乎很棘手。虽然我能够得到最大乘积,但我并没有真正得到最大乘积子阵列的正确范围 解释了获得最大乘积的方法,但我不知道如何获得子阵列的范围 有人能帮我理解射程问题吗?这是一个标准的面试问题,我想确保我理解产品案例的逻辑,而不是说可以修改最大和子阵列来回答最大产品子阵列案例Algorithm 用Kadanes算法求最大乘积子阵的范围,algorithm,kadanes-algorithm,Algorithm,Kadanes Algorithm,应用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;
}