diff --git a/Dynamic-Programming/MaxProductOfThree.js b/Dynamic-Programming/MaxProductOfThree.js index 58e5e6362..635aa8ee1 100644 --- a/Dynamic-Programming/MaxProductOfThree.js +++ b/Dynamic-Programming/MaxProductOfThree.js @@ -10,25 +10,25 @@ export function maxProductOfThree (arrayItems) { const n = arrayItems.length if (n < 3) throw new Error('Triplet cannot exist with the given array') let max1 = arrayItems[0] - let max2 = -1 - let max3 = -1 + let max2 = null + let max3 = null let min1 = arrayItems[0] - let min2 = -1 + let min2 = null for (let i = 1; i < n; i++) { if (arrayItems[i] > max1) { max3 = max2 max2 = max1 max1 = arrayItems[i] - } else if (max2 === -1 || arrayItems[i] > max2) { + } else if (max2 === null || arrayItems[i] > max2) { max3 = max2 max2 = arrayItems[i] - } else if (max3 === -1 || arrayItems[i] > max3) { + } else if (max3 === null || arrayItems[i] > max3) { max3 = arrayItems[i] } if (arrayItems[i] < min1) { min2 = min1 min1 = arrayItems[i] - } else if (min2 === -1 || arrayItems[i] < min2) { + } else if (min2 === null || arrayItems[i] < min2) { min2 = arrayItems[i] } } diff --git a/Dynamic-Programming/tests/MaxProductOfThree.test.js b/Dynamic-Programming/tests/MaxProductOfThree.test.js index 32aaec542..68ed8bedd 100644 --- a/Dynamic-Programming/tests/MaxProductOfThree.test.js +++ b/Dynamic-Programming/tests/MaxProductOfThree.test.js @@ -15,3 +15,56 @@ describe('MaxProductOfThree', () => { expect(maxProductOfThree([10, -6, 5, 3, 1, -10])).toBe(600) }) }) + +// Tests using random arrays of size 3 to 5, with values rangin from -4 to 4 +// The output is compared to a slower function that calculates all possible products of 3 numbers in the array and returns the largest one +describe('MaxProductOfThree, random arrays of size 3 to 5', () => { + // Slower function that operates in O(n^3), where n is the length of the input array. + // Calculates all possible products of 3 numbers in the array and returns the largest + function completeMaxThree (array) { + let maximumProduct = null + for (let i = 0; i < array.length - 2; i++) { + for (let j = i + 1; j < array.length - 1; j++) { + for (let k = j + 1; k < array.length; k++) { + const currentProduct = array[i] * array[j] * array[k] + if (maximumProduct === null || currentProduct > maximumProduct) { + maximumProduct = currentProduct + } + } + } + } + return maximumProduct + } + + // Set up consts for the tests + const maxValue = 4 + const minValue = -4 + const maxLength = 5 + const minLength = 3 + const numberOfRandomTests = 5000 + + // Run each test + for (let i = 0; i < numberOfRandomTests; i++) { + const arr = [] + // Randomize the length of the array in the current test + const length = Math.floor(Math.random() * (maxLength - minLength) + minLength) + + // Fill the array with random values in the specified range + for (let j = 0; j < length + 1; j++) { + arr.push(Math.floor(Math.random() * (maxValue - minValue) + minValue)) + } + + // Calculate the actual max product, slow but completely + const expectedProduct = completeMaxThree(arr) + + // Set up the expectation + it('Expect the array ' + arr.toString() + ' to return the maximum three product of ' + expectedProduct, () => { + // Calculate the max three product using the function being tested + const actualProduct = maxProductOfThree(arr) + + // Was unable to use expect().toBe(), since it sometimes compared 0 to -0, and that would not pass + // At the same time, standardjs forbid me from checking for === -0 to convert to 0 + expect(actualProduct === expectedProduct).toBeTruthy() + }) + } +})