1577. 数的平方等于两数乘积的方法数
大约 3 分钟
---
1577. 数的平方等于两数乘积的方法数
- 标签:数组、哈希表、数学、双指针
- 难度:中等
题目链接
题目大意
描述:给定两个整数数组 和 。
要求:返回满足以下条件的元组数量()或():
- 对于 :,。
- 对于 :,。
返回两种情况的元组总数。
说明:
- 。
- 。
示例:
- 示例 1:
输入:nums1 = [7,4], nums2 = [5,2,8,9]
输出:1
解释:类型 1:(1,1,2), nums1[1]^2 = nums2[1] * nums2[2] (4^2 = 2 * 8)- 示例 2:
输入:nums1 = [1,1], nums2 = [1,1,1]
输出:9
解释:所有三元组都符合题目要求,因为 1^2 = 1 * 1
类型 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]
类型 2:(0,0,1), (1,0,1), (2,0,1), nums2[i]^2 = nums1[j] * nums1[k]解题思路
思路 1:哈希表
1. 核心思想
对于每个数组,计算所有两数乘积的频率。然后遍历另一个数组,计算每个元素的平方,在乘积频率中查找。
注意 ,但对于相同值不同位置的元素视为不同元组。
2. 具体步骤
第 1 步:定义函数 :
- 统计 中所有两数乘积()的频率。
- 遍历 ,对每个元素 ,计算 ,在乘积频率中查找。
第 2 步:返回 。
3. 乘积频率的计算
对于 ,每个乘积出现一次。
对于 ,题目要求 ,所以不统计。
freq = {}
for j in range(len(b)):
for k in range(j + 1, len(b)):
product = b[j] * b[k]
freq[product] = freq.get(product, 0) + 14. 举例说明
以 为例:
的两数积:
- , , , , , 。
:
- ,次数 。
的两数积:
:
总次数 。
思路 1:代码
class Solution:
def numTriplets(self, nums1: List[int], nums2: List[int]) -> int:
def count(a, b):
freq = {}
for j in range(len(b)):
for k in range(j + 1, len(b)):
product = b[j] * b[k]
freq[product] = freq.get(product, 0) + 1
ans = 0
for x in a:
val = x * x
ans += freq.get(val, 0)
return ans
return count(nums1, nums2) + count(nums2, nums1)思路 1:复杂度分析
- 时间复杂度:,,。
- 空间复杂度: 或 ,乘积频率表。