gpt4 book ai didi

java - 最大乘积子数组的范围(Kadane 算法变体)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:26 25 4
gpt4 key购买 nike

我一直在尝试获取子数组的最大积的范围(为求职面试而学习)。

这已经在这里问过(但没有提供有效的答案)。 Getting range of max product subarray using Kadanes algorithm

技巧/算法在这里得到了很好的解释:http://www.geeksforgeeks.org/maximum-product-subarray/

我能够轻松获得最大乘积,但经过多次尝试,仍然无法弄清楚如何获得范围(左右索引正确)。有人可以帮忙吗??

我已经粘贴了我的代码,所以你可以复制并快速运行它..

import java.util.*;

public class ArrayMax {

// maximum product
public static int[] getMaxProduct(int[] list)
{
int max = 1, min = 1, maxProd = 0;
int l = 0, left = 0, right = 0;

for (int i = 0; i < list.length; i++) {

// positive number!
if (list[i] > 0) {
max = max * list[i];
min = Math.min(1, min * list[i]);
}
else if (list[i] == 0) {
max = 1; // reset all
min = 1;
l = i + 1;
}
else {
// hold the current Max
int tempMax = max;
// need to update left here (but how??)
max = Math.max(min * list[i], 1); // [-33, 3]
min = tempMax * list[i]; // update min with prev max

}

// System.out.printf("[%d %d]%n", max, min);
if (max >= maxProd) {
maxProd = max;
right = i;
left = l;
}
}

System.out.println("Max: " + maxProd);
// copy array
return Arrays.copyOfRange(list, left, right + 1);
}


// prints array
public static void printArray(int[] list) {

System.out.print("[");
for (int i = 0; i < list.length; i++) {
String sep = (i < list.length - 1) ? "," : "";
System.out.printf("%d%s", list[i], sep);
}

System.out.print("]");
}

public static void main(String[] args) {

int[][] list = {
{5, 1, -3, -8},
{0, 0, -11, -2, -3, 5},
{2, 1, -2, 9}
};

for (int i = 0; i < list.length; i++) {
int[] res = getMaxProduct(list[i]);

printArray(list[i]);
System.out.print(" => ");
printArray(res);

System.out.println();
}
}
}

这里是示例输出:

Max: 120
[5,1,-3,-8] => [5,1,-3,-8]
Max: 30
[0,0,-11,-2,-3,5] => [-11,-2,-3,5]
Max: 9
[2,1,-2,9] => [2,1,-2,9]

如您所见,我得到了最大乘积,但范围不对。

Case#2, Max is 30 (correct answer: [-2,-3,5], showing: [-11,-2,-3,5])
Case#3, Max is 9 (correct answer: [9], giving: [2,1,-2,9])

请帮忙。

最佳答案

更简单的方法是在计算完 maxProd(最后)后尝试找到左侧位置/标记。您的正确位置是准确的,因此从左到右设置并将 maxProd 除以 list[left] 直到您达到 1,同时向左递减。那是你到达左边的时候。

返回前的以下代码应该可以解决它。

int temp = maxProd;
left = right;
while (temp != 1) {
temp = temp / list[left--];
}
left++;
// copy array
return Arrays.copyOfRange(list, left, right + 1);

关于java - 最大乘积子数组的范围(Kadane 算法变体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23862863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com