Triplet的最大值和最小值

时间:2013-10-29 02:47:00

标签: java arrays algorithm max minimum

我有一个Java计算问题,其中给出了一个整数数组:

例如:

3 -2 -10 0 1

我应该计算什么是最小整数和最大三元组 可以从这些整数形成。 (在这种情况下,min = -30,max = 60)

我最初认为最大值总是正数,最小值总是最小值 负

因此,

我的初始算法是:

  1. 扫描阵列并取出里面的3个最大元素,存储到数组中。
  2. 同时,取出里面的3个最小元素,存储到另一个数组中。
  3. 通过不平等,我们可以推断出以下内容:

    + ve =( - )( - )(+)或(+)(+)(+)

    -ve =(+)(+)( - )或( - )( - )( - )

    因此,我使用了我计算的两个数组中的元素来尝试获得最大和最小三元组。 (即为了获得最大三元组,我将最大3形成的三元组与最小2和最大整数形成的三元组进行比较)

    然而,我意识到,如果所有给定的整数都是负数,那么我的算法将被击败,因为最大值将是负数。 (反之亦然)

    我知道我可以简单地添加更多检查来解决这个问题,或者只是使用强力O(N ^ 3)解决方案。但必须有更好的方法来解决这个问题。

    这个问题必须通过递归来解决,并且只能在O(N)时间内解决。

    我正在解决问题。有人可以指导我吗?

    感谢。

2 个答案:

答案 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)时间完成,但这不是递归具有自然位置的算法。你必须使用琐碎的尾递归来代替循环。