diff --git a/Dynamic-Programming/MaxProductOfThree.js b/Dynamic-Programming/MaxProductOfThree.js index 58e5e63628..635aa8ee1d 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 32aaec5427..68ed8bedd0 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() + }) + } +})
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: