Number of Ways Where Square of Number Is Equal to Product of Two Numbers
MediumUpdated: Aug 2, 2025
Practice on:
Problem
Given two arrays of integers nums1 and nums2, return the number of triplets formed (type 1 and type 2) under the following rules:
- Type 1: Triplet (i, j, k) if
nums1[i]2 == nums2[j] * nums2[k]where0 <= i < nums1.lengthand0 <= j < k < nums2.length. - Type 2: Triplet (i, j, k) if
nums2[i]2 == nums1[j] * nums1[k]where0 <= i < nums2.lengthand0 <= j < k < nums1.length.
Examples
Example 1
Input: nums1 = [7,4], nums2 = [5,2,8,9]
Output: 1
Explanation: Type 1: (1, 1, 2), nums1[1]2 = nums2[1] * nums2[2]. (42 = 2 * 8).
Example 2
Input: nums1 = [1,1], nums2 = [1,1,1]
Output: 9
Explanation: All Triplets are valid, because 12 = 1 * 1.
Type 1: (0,0,1), (0,0,2), (0,1,2), (1,0,1), (1,0,2), (1,1,2). nums1[i]2 = nums2[j] * nums2[k].
Type 2: (0,0,1), (1,0,1), (2,0,1). nums2[i]2 = nums1[j] * nums1[k].
Example 3
Input: nums1 = [7,7,8,3], nums2 = [1,2,9,7]
Output: 2
Explanation: There are 2 valid triplets.
Type 1: (3,0,2). nums1[3]2 = nums2[0] * nums2[2].
Type 2: (3,0,1). nums2[3]2 = nums1[0] * nums1[1].
Constraints
1 <= nums1.length, nums2.length <= 10001 <= nums1[i], nums2[i] <= 10^5
Solution
Method 1 – Hash Map for Pair Products
Intuition
For each number in one array, count how many pairs in the other array multiply to its square. Use a hash map to count all pair products efficiently.
Approach
- For each number in nums1, count pairs in nums2 whose product equals its square. Do the same for nums2 and nums1.
- For each array, build a hash map of product counts for all pairs (j < k).
- For each number in the other array, add the count of pairs whose product equals its square.
- Sum both directions for the answer.
Code
C++
class Solution {
public:
int numTriplets(vector<int>& nums1, vector<int>& nums2) {
return count(nums1, nums2) + count(nums2, nums1);
}
int count(vector<int>& a, vector<int>& b) {
unordered_map<long long, int> prod;
int n = b.size();
for (int i = 0; i < n; ++i) {
for (int j = i+1; j < n; ++j) {
prod[1LL * b[i] * b[j]]++;
}
}
int ans = 0;
for (int x : a) ans += prod[1LL * x * x];
return ans;
}
};
Go
func numTriplets(nums1, nums2 []int) int {
return count(nums1, nums2) + count(nums2, nums1)
}
func count(a, b []int) int {
prod := map[int64]int{}
for i := 0; i < len(b); i++ {
for j := i+1; j < len(b); j++ {
prod[int64(b[i])*int64(b[j])]++
}
}
ans := 0
for _, x := range a {
ans += prod[int64(x)*int64(x)]
}
return ans
}
Java
class Solution {
public int numTriplets(int[] nums1, int[] nums2) {
return count(nums1, nums2) + count(nums2, nums1);
}
private int count(int[] a, int[] b) {
Map<Long, Integer> prod = new HashMap<>();
int n = b.length;
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
long p = 1L * b[i] * b[j];
prod.put(p, prod.getOrDefault(p, 0) + 1);
}
}
int ans = 0;
for (int x : a) ans += prod.getOrDefault(1L * x * x, 0);
return ans;
}
}
Kotlin
class Solution {
fun numTriplets(nums1: IntArray, nums2: IntArray): Int {
fun count(a: IntArray, b: IntArray): Int {
val prod = mutableMapOf<Long, Int>()
for (i in b.indices) for (j in i+1 until b.size)
prod[b[i].toLong() * b[j].toLong()] = prod.getOrDefault(b[i].toLong() * b[j].toLong(), 0) + 1
var ans = 0
for (x in a) ans += prod.getOrDefault(x.toLong() * x.toLong(), 0)
return ans
}
return count(nums1, nums2) + count(nums2, nums1)
}
}
Python
class Solution:
def numTriplets(self, nums1: list[int], nums2: list[int]) -> int:
def count(a: list[int], b: list[int]) -> int:
from collections import Counter
prod = Counter()
n = len(b)
for i in range(n):
for j in range(i+1, n):
prod[b[i]*b[j]] += 1
ans = 0
for x in a:
ans += prod[x*x]
return ans
return count(nums1, nums2) + count(nums2, nums1)
Rust
impl Solution {
pub fn num_triplets(nums1: Vec<i32>, nums2: Vec<i32>) -> i32 {
fn count(a: &Vec<i32>, b: &Vec<i32>) -> i32 {
use std::collections::HashMap;
let mut prod = HashMap::new();
for i in 0..b.len() {
for j in i+1..b.len() {
*prod.entry((b[i] as i64)*(b[j] as i64)).or_insert(0) += 1;
}
}
let mut ans = 0;
for &x in a {
ans += *prod.get(&(x as i64 * x as i64)).unwrap_or(&0);
}
ans
}
count(&nums1, &nums2) + count(&nums2, &nums1)
}
}
TypeScript
class Solution {
numTriplets(nums1: number[], nums2: number[]): number {
function count(a: number[], b: number[]): number {
const prod = new Map<number, number>()
for (let i = 0; i < b.length; i++)
for (let j = i+1; j < b.length; j++)
prod.set(b[i]*b[j], (prod.get(b[i]*b[j]) ?? 0) + 1)
let ans = 0
for (let x of a) ans += prod.get(x*x) ?? 0
return ans
}
return count(nums1, nums2) + count(nums2, nums1)
}
}
Complexity
- ⏰ Time complexity:
O(m^2 + n^2), where m and n are the lengths of nums1 and nums2. We count all pairs in each array. - 🧺 Space complexity:
O(m^2 + n^2), for storing all pair products in hash maps.