Welcome to Subscribe On Youtube
923. 3Sum With Multiplicity
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
.
Example 1:
Input: arr = [1,1,2,2,3,3,4,4,5,5], target = 8 Output: 20 Explanation: Enumerating by the values (arr[i], arr[j], arr[k]): (1, 2, 5) occurs 8 times; (1, 3, 4) occurs 8 times; (2, 2, 4) occurs 2 times; (2, 3, 3) occurs 2 times.
Example 2:
Input: arr = [1,1,2,2,2,2], target = 5 Output: 12 Explanation: arr[i] = 1, arr[j] = arr[k] = 2 occurs 12 times: We choose one 1 from [1,1] in 2 ways, and two 2s from [2,2,2,2] in 6 ways.
Example 3:
Input: arr = [2,1,3], target = 6 Output: 1 Explanation: (1, 2, 3) occured one time in the array so we return 1.
Constraints:
3 <= arr.length <= 3000
0 <= arr[i] <= 100
0 <= target <= 300
Solutions
-
class Solution { private static final int MOD = (int) 1e9 + 7; public int threeSumMulti(int[] arr, int target) { int[] cnt = new int[101]; for (int v : arr) { ++cnt[v]; } long ans = 0; for (int j = 0; j < arr.length; ++j) { int b = arr[j]; --cnt[b]; for (int i = 0; i < j; ++i) { int a = arr[i]; int c = target - a - b; if (c >= 0 && c <= 100) { ans = (ans + cnt[c]) % MOD; } } } return (int) ans; } }
-
class Solution { public: const int mod = 1e9 + 7; int threeSumMulti(vector<int>& arr, int target) { int cnt[101] = {0}; for (int& v : arr) { ++cnt[v]; } long ans = 0; for (int j = 0; j < arr.size(); ++j) { int b = arr[j]; --cnt[b]; for (int i = 0; i < j; ++i) { int a = arr[i]; int c = target - a - b; if (c >= 0 && c <= 100) { ans += cnt[c]; ans %= mod; } } } return ans; } };
-
class Solution: def threeSumMulti(self, arr: List[int], target: int) -> int: cnt = Counter(arr) ans = 0 mod = 10**9 + 7 for j, b in enumerate(arr): cnt[b] -= 1 for i in range(j): a = arr[i] c = target - a - b ans = (ans + cnt[c]) % mod return ans
-
func threeSumMulti(arr []int, target int) int { const mod int = 1e9 + 7 cnt := [101]int{} for _, v := range arr { cnt[v]++ } ans := 0 for j, b := range arr { cnt[b]-- for i := 0; i < j; i++ { a := arr[i] c := target - a - b if c >= 0 && c <= 100 { ans += cnt[c] ans %= mod } } } return ans }
-
function threeSumMulti(arr: number[], target: number): number { const mod = 10 ** 9 + 7; const cnt: number[] = Array(101).fill(0); for (const x of arr) { ++cnt[x]; } let ans = 0; const n = arr.length; for (let j = 0; j < n; ++j) { --cnt[arr[j]]; for (let i = 0; i < j; ++i) { const c = target - arr[i] - arr[j]; if (c >= 0 && c < cnt.length) { ans = (ans + cnt[c]) % mod; } } } return ans; }