Problem
Given an n-length Array of integers ranging from -1000 to 1000 find the largest product of three numbers in A that you can get.
Example
[-3,2,6,4,8] => 192
My Solution
There are three basic scenarios that can produce the largest product:
- The largest three positive numbers
- The largest positive number and the smallest two negative numbers
- The largest three negative numbers
The first task is to sort the array, that means that the largest numbers are at the right and the smallest area on the left.
a | b | c | … | … | … | x | y | z |
Something like this, with a, b and c being the smallest values and x, y, and z being the largest values.
The first scenario happens when x*y
is greater than a*b
. Consequently, the second scenario only occurs when a*b
is greater than x*y
. We will always use z in these two scenarios because it is the largest positive number and two negatives will always give a positive.
The third scenario only occurs when z is less than 0. In this case, we now want the smallest absolute value which happens to be the largest number.
Examples
Scenario 1
[-4, -5, 1, 2, 7, 9, 10]x * y = 7 * 9 = 63
which is greater thana * b = -5 * -4 = 20
Scenario 2
[-9, -8, -7, 1, 2, 3]x * y = 2
which is less thana * b = 72
Scenario 3
[-5, -4, -3, -2, -1] z is negative,
This leads to the following code
function solution(A) {
A.sort((a,b) => a-b)
const n = A.length
const positiveProduct = A[n-2] * A[n-3]
const negativeProduct = A[0] * A[1]
if (positiveProduct > negativeProduct || A[n -1] < 0){
return A[n-1] * positiveProduct
}
return A[n-1] * negativeProduct
}
Code language: JavaScript (javascript)
Notes:
- You shouldn’t do operations on A because that mutates the A outside the function. So here normally we’d have created a copy
const aCopy = [...A];
- The
positiveProduct
andnegativeProduct
could be named better.
And that’s that.