Maximum Product
June 11, 2019
I think today’s exercise comes from one of those hacker testing sites, but I’m not sure:
Given three arrays of integers, both positive and negative, find the maximum product that can be formed by taking one element from each array. For instance, if A = [10,-10,15,-2], B = [10,-12,13,-2], and C = [-11,-10,9,-12], the maximum product is 2160 using 15, -12 and -12.
Your task is to write a program that finds the maximum product of three integers, taking one each from three arrays. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
Cool problem. Here is my take on it using Julia 1.0.2:
function fmp(A::Array{Int64, 1}, B::Array{Int64, 1}, C::Array{Int64, 1})
Aa = abs.(A)
na = length(A)
ind_a = sortperm(Aa, rev = true)
Ba = abs.(B)
nb = length(B)
ind_b = sortperm(Ba, rev = true)
Ca = abs.(C)
nc = length(C)
ind_c = sortperm(Ca, rev = true)
mp = typemin(Int64)
Z = Array{Int64}(undef, 3)
counter = 0
iwp = round(Int64, sqrt(nanbnc)) # iterations without progress
end
Note that to avoid unnecessary iterations, I limited the total number of iteration by including the iwp threshold (iterations without progress). This is heuristically calculated using the sizes of the original arrays as an input. Tried it with larger arrays and it works, though I cannot vouch for its effectiveness for all sizes. Cheers!
Here is a simple R7RS Scheme solution to a slightly more general
problem; it works for one or more “arrays” (lists) of numbers as
input.
Slightly more general in Perl – but uses a similar technique – written to allow any number of arrays
In Python. Only eight product are possible. Simple calculate the maximum of these eight. Reducing the number of products to four hardly reduces calculation time and only makes things more complicated.
@Zack: I don’t understand how the ‘iwp’ cutoff is correct. If there is a very large item at the end of array C, won’t it be missed? Also, your method seems to be Theta(n^3) instead of the other Theta(n) solutions.
@Paul: that’s a good question. That’s why I sort the arrays first, in terms of absolute values. Chances are that the first iterations of the loops are going to yield the optimum result, so we never have to go through all possible combinations (something wasteful for large arrays). The latter are more than 8 for the original arrays, btw; namely Total_Combinations = 4 x 4 x 4 = 64. Cheers
Rust version:
Playground: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=377bd1520d7bd51bb59bd268c654eab4
Here’s a solution in C.
Example Usage: