Back to all solutions
#923 - 3Sum With Multiplicity
Problem Description
Given an integer array arr, and an integer target, return the number of tuples i, j, k such that i < j < k and arr[i] + arr[j] + arr[k] == target.
As the answer can be very large, return it modulo 109 + 7.
Solution
/**
* @param {number[]} arr
* @param {number} target
* @return {number}
*/
var threeSumMulti = function(arr, target) {
const MOD = 1e9 + 7;
const counts = new Map();
let result = 0;
for (const num of arr) {
counts.set(num, (counts.get(num) || 0) + 1);
}
const uniqueNums = [...counts.keys()].sort((a, b) => a - b);
for (let i = 0; i < uniqueNums.length; i++) {
const num1 = uniqueNums[i];
for (let j = i; j < uniqueNums.length; j++) {
const num2 = uniqueNums[j];
const num3 = target - num1 - num2;
if (num3 < num2) continue;
const count1 = counts.get(num1);
const count2 = counts.get(num2);
const count3 = counts.get(num3) || 0;
if (num1 === num2 && num2 === num3) {
result = (result + (count1 * (count1 - 1) * (count1 - 2)) / 6) % MOD;
} else if (num1 === num2) {
result = (result + (count1 * (count1 - 1) * count3) / 2) % MOD;
} else if (num2 === num3) {
result = (result + (count1 * count2 * (count2 - 1)) / 2) % MOD;
} else {
result = (result + count1 * count2 * count3) % MOD;
}
}
}
return result;
};