mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-05 00:01:37 +08:00
fix: fixed error in the MaxProductOfThree algorithm (#1295)
* fix: fixed error in the MaxProductOfThree algorithm Fixed the error in the MaxProductOfThree by initializing the max and min variables to null instead of -1. The checks were then altered to check for null instead of -1. Also wrote more tests, which randomly generated small arrays and compared the output of the maxProductOfThree-algorithm to the output of a slower, but complete, function which calculates all posible triple-products of the values of the array. Fixes: #1294 * fix: Added newlines at the end of the files
This commit is contained in:
@ -10,25 +10,25 @@ export function maxProductOfThree (arrayItems) {
|
|||||||
const n = arrayItems.length
|
const n = arrayItems.length
|
||||||
if (n < 3) throw new Error('Triplet cannot exist with the given array')
|
if (n < 3) throw new Error('Triplet cannot exist with the given array')
|
||||||
let max1 = arrayItems[0]
|
let max1 = arrayItems[0]
|
||||||
let max2 = -1
|
let max2 = null
|
||||||
let max3 = -1
|
let max3 = null
|
||||||
let min1 = arrayItems[0]
|
let min1 = arrayItems[0]
|
||||||
let min2 = -1
|
let min2 = null
|
||||||
for (let i = 1; i < n; i++) {
|
for (let i = 1; i < n; i++) {
|
||||||
if (arrayItems[i] > max1) {
|
if (arrayItems[i] > max1) {
|
||||||
max3 = max2
|
max3 = max2
|
||||||
max2 = max1
|
max2 = max1
|
||||||
max1 = arrayItems[i]
|
max1 = arrayItems[i]
|
||||||
} else if (max2 === -1 || arrayItems[i] > max2) {
|
} else if (max2 === null || arrayItems[i] > max2) {
|
||||||
max3 = max2
|
max3 = max2
|
||||||
max2 = arrayItems[i]
|
max2 = arrayItems[i]
|
||||||
} else if (max3 === -1 || arrayItems[i] > max3) {
|
} else if (max3 === null || arrayItems[i] > max3) {
|
||||||
max3 = arrayItems[i]
|
max3 = arrayItems[i]
|
||||||
}
|
}
|
||||||
if (arrayItems[i] < min1) {
|
if (arrayItems[i] < min1) {
|
||||||
min2 = min1
|
min2 = min1
|
||||||
min1 = arrayItems[i]
|
min1 = arrayItems[i]
|
||||||
} else if (min2 === -1 || arrayItems[i] < min2) {
|
} else if (min2 === null || arrayItems[i] < min2) {
|
||||||
min2 = arrayItems[i]
|
min2 = arrayItems[i]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,3 +15,56 @@ describe('MaxProductOfThree', () => {
|
|||||||
expect(maxProductOfThree([10, -6, 5, 3, 1, -10])).toBe(600)
|
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()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
Reference in New Issue
Block a user