arrays - 从三个数组中找到每个元素的最大乘积

标签 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。

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

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]+".");

到目前为止我的想法:

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

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

最佳答案

一个选项是对所有三个数组进行排序,每个数组花费 O(nlogn) 时间(这不是嵌套的),然后将每个已排序数组中最积极和消极的元素放入另一个数组中,您也对其进行排序O(nlogn) 时间。

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

关于arrays - 从三个数组中找到每个元素的最大乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56527448/

相关文章:

python - 删除 array([]) 括号为矩阵方程创建干净的数组

java - 如何从 JSONObject 接收数据到简单数组

algorithm - 如何计算这个函数的增长率 : T(n) = 2T(n^(1/2)) + 2(n^(1/2))

java - 对来自同一类的不同实例的值进行排序

c++ - 动态对象的动态数组

c++ - 在 boolean 数组中输入

algorithm - 具有 i 的乘法增量的循环的复杂性/大 theta

python - 如何通过列表的长度确定数组的维度

ruby - 如何将 UTF-8 支持添加到 Ruby 中的排序(包括 ł 字符,而不影响可移植性)?

javascript - 在 JavaScript 中对数组进行排序 : items with most elements in descending order