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
Solution 1: Counting + Enumeration
We can use a hash table or an array \(cnt\) of length \(101\) to count the occurrence of each element in the array \(arr\).
Then, we enumerate each element \(arr[j]\) in the array \(arr\), first subtract one from \(cnt[arr[j]]\), and then enumerate the elements \(arr[i]\) before \(arr[j]\), calculate \(c = target - arr[i] - arr[j]\). If \(c\) is in the range of \([0, 100]\), then the answer is increased by \(cnt[c]\), and finally return the answer.
Note that the answer may exceed \({10}^9 + 7\), so take the modulus after each addition operation.
The time complexity is \(O(n^2)\), where \(n\) is the length of the array \(arr\). The space complexity is \(O(C)\), where \(C\) is the maximum value of the elements in the array \(arr\), in this problem \(C = 100\).
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|