Skip to content

fix: fixed error in the MaxProductOfThree algorithm #1295

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions Dynamic-Programming/MaxProductOfThree.js
Original file line number Diff line number Diff line change
Expand Up @@ -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]
}
}
Expand Down
53 changes: 53 additions & 0 deletions Dynamic-Programming/tests/MaxProductOfThree.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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()
})
}
})