最大乘积子数组给定一个数组包含正整数和负整数,求最大乘积的子数组。例子:
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;
}
但不能破题找到子数组。
通过分而治之可以有效地解决这个问题。
假设您想要解决子数组[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)
空间。
有没有一种方法可以在小于O(n^2)的时间内做到这一点。 O(nlogn)还是O(n)?
null 我的代码使用一个递归函数和一个helper print()函数来查找这些数字中最大的一个 编辑:发布print()函数,我不知何故错过了这个函数
int main() { int array[201]; int i; for (i = 0; i < 201; i++) array[i] = i; return 0; } 技巧 在gdb中,如果要打印大数组的内容,缺省最多会显示200个元素: (gdb) p array $1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
在长度为N的数组中求和最大的邻接子数组。 输入格式: 输出格式: 返回一个整数,表示相邻子数组的最大可能和。 制约因素: 输入2:A=[-2,1,-3,4,-1,2,1,-5,4] 产出2:6 说明2:子数组[4,-1,2,1]的最大可能和为6。 你能告诉我为什么下面的代码不起作用,代码中的错误是什么吗:
所以,我刚刚进行了一次在线编程评估,给了我两个问题,其中一个是这个连续的子数组和提供了两个复杂的编码问题+8个MCQ,并将在1小时内完成。 这里我将讨论上面提到的子数组的最大邻接和之一。通常,我发现困难的部分是处理负数和连续。我所做的是首先将应用到给定的数组,然后再次按照负值的绝对值排序,就像i的例如,对于给定的随机数组,我在每个i和所有j迭代后都有一个max,如果max 。
给出了一个由N个整数组成的数组。 数组的最大和是该数组的非空连续子数组的元素的最大和。 例如,数组[1,-2,3,-2,5]的最大和是6,因为子数组[3,-2,5]的和是6,并且不可能实现更大的子数组和。 现在,您只能从给定数组中删除一个以上的元素。这样做可以得到的结果数组的最大可能最大和是多少? 我正在用我自己的测试用例测试我的代码。我在Dev-C++上得到了正确的输出。但是当我在网上测试我的代