我有一个Java计算问题,其中给出了一个整数数组:
例如:
3 -2 -10 0 1
我应该计算什么是最小整数和最大三元组 可以从这些整数形成。 (在这种情况下,min = -30,max = 60)
我最初认为最大值总是正数,最小值总是最小值 负
因此,
我的初始算法是:
通过不平等,我们可以推断出以下内容:
+ ve =( - )( - )(+)或(+)(+)(+)
-ve =(+)(+)( - )或( - )( - )( - )
因此,我使用了我计算的两个数组中的元素来尝试获得最大和最小三元组。 (即为了获得最大三元组,我将最大3形成的三元组与最小2和最大整数形成的三元组进行比较)
然而,我意识到,如果所有给定的整数都是负数,那么我的算法将被击败,因为最大值将是负数。 (反之亦然)
我知道我可以简单地添加更多检查来解决这个问题,或者只是使用强力O(N ^ 3)解决方案。但必须有更好的方法来解决这个问题。
这个问题必须通过递归来解决,并且只能在O(N)时间内解决。
我正在解决问题。有人可以指导我吗?
感谢。
答案 0 :(得分:1)
如果在线性时间内找到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;
}
答案 1 :(得分:0)
首先,您只需要解决两个问题中的一个,比如找到最大的三重产品。有了这个,您可以通过否定所有输入值找到最少,找到最大的三重产品,并否定找到答案。
所以让我们专注于寻找最大的。你有很好的解决方案。首先取最大正数(如果有的话)。然后选择两个最大的剩余正数或两个最大(数量级)的负数,即哪一对具有最大的产品。
如果根本没有正数,则选择三个最小的负数。
当然这可以在O(n)时间完成,但这不是递归具有自然位置的算法。你必须使用琐碎的尾递归来代替循环。