Python程序:找到平方数等于两个数乘积的方案数
假设我们有两个数组nums1和nums2,我们要找到满足以下两个规则的三元组(类型1和类型2)的数量 –
- 三元组(i,j,k)如果nums1 [i] ^ 2 = nums2 [j] * nums2 [k],其中[0 <= i
- 三元组(i,j,k)如果nums2 [i] ^ 2 = nums1 [j] * nums1 [k],其中[0 <= i
因此,如果输入是nums1 = [7,4] nums2 = [5,2,8,9],则输出将为1,因为有一种类型1的三元组(1,1,2),nums1 [1] ^ 2 = nums2 [1] * nums2 [2] = (16 = 2*8)。
要解决此问题,我们将遵循以下步骤:
- cnt1:一个映射将nums1中的每个元素及其计数保存下来。
- cnt2:一个映射将nums2中的每个元素及其计数保存下来。
- 定义函数triplets(),该函数将接受arr1,arr2。
- ans:初始值为0。
- 对于arr1中的每个t,v的items(),
- 如果arr2中存在t,k等于arr2 [t],否则k等于0。
- tmp等于k*(k-1)/ 2。
- sq等于t * t。
- 对于arr2中的每个m,
- 如果m<t,并且sq mod m等于0,则-
- tmp:= tmp +(存在则为arr2 [m],否则为0)*(存在则为arr2 [sq / m的商],否则为0)。
- ans = ans + tmp * v
- 返回ans
- 从主方法中执行以下操作-
- 返回triplets(cnt1,cnt2)+ triplets(cnt2,cnt1)
示例
让我们看看以下实现以更好地理解-
from collections import Counter
def solve(nums1, nums2):
cnt1 = Counter(nums1)
cnt2 = Counter(nums2)
def triplets(arr1, arr2):
ans = 0
for t, v in arr1.items():
k = arr2.get(t, 0)
tmp = k * (k - 1) // 2
sq = t * t
for m in arr2:
if m < t and sq % m == 0:
tmp += arr2.get(m, 0) * arr2.get(sq // m, 0)
ans += tmp * v
return ans
return triplets(cnt1, cnt2) + triplets(cnt2, cnt1)
nums1 = [7,4]
nums2 = [5,2,8,9]
print(solve(nums1, nums2))
输入
[7,4],[5,2,8,9]
输出
2