Java 打印数组中最大连续乘积的子数组
最大乘积子阵 给定一个包含正整数和负整数的数组,找到最大乘积的子数组。 示例: 输入: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算法一样,我试图重用它来查找子数组,但无法中断查找开始索引的部分,查找结束索引很容易。结束索引是resJava 打印数组中最大连续乘积的子数组,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
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建议的地方。请查看上面链接提供的解决方案。你只需要做一些小的更改就可以达到你的目标。