从三个数组中找出每个元素的最大乘积

时间:2019-06-10 13:32:07

标签: arrays algorithm sorting data-structures

给出3个具有整数(正负)的可变长度数组,找到可以乘以每个数组中的元素而形成的最大乘积。

例如。

A = [ 10, -10,15,-12];
B = [10, -12,13,-12];
C = [-11, -10, 9,-12];

对于上述阵列:使用15,-12,-12的最大乘积= 2160。

我尝试使用暴力嵌套方法O(N ^ 3)通过三个嵌套的for循环来实现它。但我正在寻找更优化的方法

int[] A = new int[]{10,-10,15,-12};
int[] B = new int[]{10,-12,13,-12};
int[] C = new int[]{-11,-10,9,-12};

int max = Integer.MIN_VALUE;

int pos[][]=new int[3][2];

for (int i=0; i < A.length ; i++ ){

    for (int j=0; j < B.length ; j++ ){

        for (int k=0; k < C.length ; k++ ){

            int prod = A[i] * B[j] * C[k];

            if( prod > max ){
                max = prod;
                pos[0][0]=i;
                pos[1][0]=j;
                pos[2][0]=k;
                pos[0][1]=A[i];
                pos[1][1]=B[j];
                pos[2][1]=C[k];
            }

        } 
    }   
}
System.out.println("Maximum product = "+max+" using "+pos[0][1]+", "+pos[1][1]+", "+pos[2][1]+".");

到目前为止我的想法:

我曾尝试过对数组进行排序,但是后来意识到我们需要使用绝对值进行排序。 然后,我想到了使用具有最大绝对值的元素。

但是无法从这里继续讨论如何选择下两个来优化解决方案。

3 个答案:

答案 0 :(得分:1)

一种选择是对所有三个数组进行排序,每个数组花费O(nlogn)时间(不嵌套),然后将每个排序数组中最正和负的元素放入另一个数组中,您也对该数组进行排序O(nlogn)时间。

这时,您只需检查6个元素的数组以查看三个最正元素的乘积是否大于最正元素和两个最负元素的乘积,然后返回该结果。

答案 1 :(得分:1)

这与How to get the K smallest Products from pairs from two sorted Arrays?非常相似,除了这里我们有三个列表并且对最大产品感兴趣。

  1. 查找每个列表的最小值和最大值:min A ,max A ,min B ,max B ,min C 和max C

  2. 最大乘积是以下最大值:

    min A * min B * min C

    min A * min B * max C

    min A * max B * min C

    min A * max B * max C

    max A * min B * min C

    max A * min B * max C

    max A * max B * min C

    max A * max B * max C

答案 2 :(得分:0)

可以通过四种方式形成最大乘积:

  1. 从三个数组的每一个中取最大值
  2. 从第一个数组中获取最大值,从第二个和第三个数组中获取最小值
  3. 从第二个数组中获取最大值,从第一个和第三个数组中获取最小值
  4. 从第三个数组中获取最大值,从第一和第二个数组中获取最小值

您可以通过排序或简单地通过依次扫描数组来找到最小和最大元素。