我有一个Java计算问题,其中我得到了一个整数数组:
例如:
3-2-10 0 1
我应该计算出可以从这些整数形成的最小整数和最大三元组是什么。(在这种情况下,最小值=-30,最大值=60)
我最初认为最大值总是正的,最小值总是负的。
因此,
我最初的算法是:
通过不等式,我们可以推断如下:
ve = (-)(-)()或( )( )( )
-ve=()()(-)或(-)(-)
因此,我使用了我计算的两个数组中的元素,试图获得最大和最小三元组。(即,为了获得最大三元组,我将由最大3形成的三元组与由最小2和最大整数形成的三元组进行比较)
然而,我意识到如果所有给定的整数都是负的,我的算法就会失败,因为最大值将是负的。(对于最小值,反之亦然)
我知道我可以简单地添加更多检查来解决这个问题,或者只是使用蛮力O(N^3)解决方案。但必须有更好的方法来解决这个问题。
这个问题必须通过递归来解决,并且只能在O(N)时间内解决。
我正在修复。有人可以指导我吗?
谢谢。
首先,你只需要解决两个问题中的一个,比如说找到最大的三重积。有了这个你就可以通过对所有输入值求反,找到最大的三重积,求反找到答案。
所以让我们集中精力寻找最大的。你已经很好地解决了。首先取最大正数(如果有的话)。然后选择两个最大的剩余正数或两个最大的(幅度)负数中的任何一个,以乘积最大的一对为准。
如果根本没有正数,那么选择三个最小的负数。
当然,这些都可以在O(n)时间内完成,但是这不是一个递归有自然位置的算法。你必须使用简单的尾部递归来代替循环。
如果您在线性时间内找到3个最大值和2个最小值,则存在O(n)解。
但是您也可以使用nlog(n)排序(即快速排序)来轻松完成这项工作。
然后在这里找到C中最大乘积三元组的解决方案,并在注释中解释 -
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int solution(int A[], int N) {
long product = A[0] * A[1] * A[2];
if (N == 3) {
return product;
}
// Nlog(N)
qsort(A, N, sizeof(int), cmpfunc);
if (A[N - 3] >= 0) {
// if there is at least 3 non-negative value
// then take three maximum values
product = A[N - 1] * A[N - 2] * A[N - 3];
if (A[1] < 0) {
// if there is at least 2 negative value
if (product < A[N - 1] * A[0] * A[1]) {
// then take maximum positive and two minimum negative, if that is more than 3 positive values
product = A[N - 1] * A[0] * A[1];
}
}
} else if (A[N - 1] >= 0) {
// else if there is least 1 non-negative value
// then take maximum positive and two minimum negative
product = A[N - 1] * A[0] * A[1];
} else {
// otherwise, take 3 maximum negative values
product = A[N - 1] * A[N - 2] * A[N - 3];
}
return product;
}
本节通过求数组的最大和最小值来提高初学者对数组的一些基本应用。 程序运行结果如下: 最高成绩:100 最低成绩:67 将变量 min 与 max 初值设成数组的第 1 个元素后,再逐一与数组中的各元素相比。比 min 小,就将该元索的值指定给 min 存放,使 min 的内容保持最小。同样,当该元素比 max 大时,就将该元素的值指定给 max 存放,使 max 的内容保持最大。for 循环执行完
主要内容:普通算法,分治算法程序中,我们经常使用数组(列表)存储给定的线性序列(例如 {1,2,3,4}),那么如何查找数组(序列)中的最大值或者最小值呢? 查找数组(序列)中最大值或最小值的算法有很多,接下来我们以 {3,7,2,1} 序列为例讲解两种查找最值的算法,一种是普通算法,另一种是借助 分治算法解决。 普通算法 普通算法的解决思路是:创建两个变量 max 和 min 分别记录数组中的最大值和最小值,它们的初始值都
问题内容: 我的代码没有给出错误,但是没有显示最小值和最大值。代码是: 我是否需要system.out.println()来显示它,否则返回应该起作用吗? 问题答案: 您正在调用方法,但不使用返回的值。
这是一个非常基本的算法(不能再简单了),但我被难住了。我们有一个元素数组,我们必须确定最小值和最大值。 通常的方法是遍历数组,找出最小值和最大值,即2n比较。 稍微有效的方法是首先对数组的连续元素进行比较,以确定任意两个元素的最大值和最小值(N/2比较)。我们现在有n/2 min和n/2 max元素。现在我们可以在n/2+n/2+n/2(前一步)=3/2*n或1.5n中得到最终的max和min 那
问题内容: 我想输出二维数组的最大值和最小值。Max可以很好地工作,但是即使在数组中没有零的情况下min也总是输出零。在本例中,我设置为99以防止较小的机会在数组中获得零。继承人完整代码: 问题答案: 由于您在中选择随机值的方式,不会存在小于零的值- 但也无法保证任何值都将恰好为零。但是,您将初始化为零,因为这是数组元素的默认值;没有什么比这更小了,所以答案总是零。 您应该在标记为“查找最小值”的
我想从数组的一部分找到最大值和最小值。我知道我可以通过复制数组将所需的数组部分复制到另一个数组中,但只是想知道是否可以不复制数组,因为我必须为不同的子数组进行循环 例如: 现在我想从1到4找到子数组的最小/最大值(如果可能,不复制子数组)