Description
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] where 0 <= i < nums1.length and 0 <= j < k < nums2.length.
- Type 2: Triplet (i, j, k) if nums2[i]2 == nums1[j] * nums1[k] where 0 <= i < nums2.length and 0 <= j < k < nums1.length.
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]. (4^2 = 2 * 8).
Example 2:
Input: nums1 = [1,1], nums2 = [1,1,1]
Output: 9
Explanation: All Triplets are valid, because 1^2 = 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].
Example 4:
Input: nums1 = [4,7,9,11,23], nums2 = [3,5,1024,12,18]
Output: 0
Explanation: There are no valid triplets.
Constraints:
- 1 <= nums1.length, nums2.length <= 1000
- 1 <= nums1[i], nums2[i] <= 10^5
分析
题目的意思是:给定两个数组,找出其中一个数组数的平方等于另一个数两数乘积的个数。我的思路也很直接,两种情况分开讨论,其中一个数组求平方,用字典统计频次,另一个数组求两数乘积,然后判断是否在字典中,在的话,加上相应的频次。最后就可以得到相应的结果了。
代码
class Solution:
def solve(self,nums1,nums2):
t=defaultdict(int)
res=0
for num in nums1:
t[num*num]+=1
n=len(nums2)
for i in range(n):
for j in range(i+1,n):
key=nums2[i]*nums2[j]
if(key in t):
res+=t[key]
return res
def numTriplets(self, nums1: List[int], nums2: List[int]) -> int:
res=0
res+=self.solve(nums1,nums2)
res+=self.solve(nums2,nums1)
return res