Welcome to Subscribe On Youtube
2964. Number of Divisible Triplet Sums
Description
Given a 0-indexed integer array nums
and an integer d
, return the number of triplets (i, j, k)
such that i < j < k
and (nums[i] + nums[j] + nums[k]) % d == 0
.
Example 1:
Input: nums = [3,3,4,7,8], d = 5 Output: 3 Explanation: The triplets which are divisible by 5 are: (0, 1, 2), (0, 2, 4), (1, 2, 4). It can be shown that no other triplet is divisible by 5. Hence, the answer is 3.
Example 2:
Input: nums = [3,3,3,3], d = 3 Output: 4 Explanation: Any triplet chosen here has a sum of 9, which is divisible by 3. Hence, the answer is the total number of triplets which is 4.
Example 3:
Input: nums = [3,3,3,3], d = 6 Output: 0 Explanation: Any triplet chosen here has a sum of 9, which is not divisible by 6. Hence, the answer is 0.
Constraints:
1 <= nums.length <= 1000
1 <= nums[i] <= 109
1 <= d <= 109
Solutions
Solution 1: Hash Table + Enumeration
We can use a hash table $cnt$ to record the occurrence times of $nums[i] \bmod d$, then enumerate $j$ and $k$, calculate the value of $nums[i] \bmod d$ that makes the equation $(nums[i] + nums[j] + nums[k]) \bmod d = 0$ hold, which is $(d - (nums[j] + nums[k]) \bmod d) \bmod d$, and accumulate its occurrence times to the answer. Then we increase the occurrence times of $nums[j] \bmod d$ by one. Continue to enumerate $j$ and $k$ until $j$ reaches the end of the array.
The time complexity is $O(n^2)$, and the space complexity is $O(n)$. Here, $n$ is the length of the array $nums$.
-
class Solution { public int divisibleTripletCount(int[] nums, int d) { Map<Integer, Integer> cnt = new HashMap<>(); int ans = 0, n = nums.length; for (int j = 0; j < n; ++j) { for (int k = j + 1; k < n; ++k) { int x = (d - (nums[j] + nums[k]) % d) % d; ans += cnt.getOrDefault(x, 0); } cnt.merge(nums[j] % d, 1, Integer::sum); } return ans; } }
-
class Solution { public: int divisibleTripletCount(vector<int>& nums, int d) { unordered_map<int, int> cnt; int ans = 0, n = nums.size(); for (int j = 0; j < n; ++j) { for (int k = j + 1; k < n; ++k) { int x = (d - (nums[j] + nums[k]) % d) % d; ans += cnt[x]; } cnt[nums[j] % d]++; } return ans; } };
-
class Solution: def divisibleTripletCount(self, nums: List[int], d: int) -> int: cnt = defaultdict(int) ans, n = 0, len(nums) for j in range(n): for k in range(j + 1, n): x = (d - (nums[j] + nums[k]) % d) % d ans += cnt[x] cnt[nums[j] % d] += 1 return ans
-
func divisibleTripletCount(nums []int, d int) (ans int) { n := len(nums) cnt := map[int]int{} for j := 0; j < n; j++ { for k := j + 1; k < n; k++ { x := (d - (nums[j]+nums[k])%d) % d ans += cnt[x] } cnt[nums[j]%d]++ } return }
-
function divisibleTripletCount(nums: number[], d: number): number { const n = nums.length; const cnt: Map<number, number> = new Map(); let ans = 0; for (let j = 0; j < n; ++j) { for (let k = j + 1; k < n; ++k) { const x = (d - ((nums[j] + nums[k]) % d)) % d; ans += cnt.get(x) || 0; } cnt.set(nums[j] % d, (cnt.get(nums[j] % d) || 0) + 1); } return ans; }