第一题非常简单的暴力解法。
class Solution:
def numberOfPairs(self, nums1: List[int], nums2: List[int], k: int) -> int:
nums2_ = [i * k for i in nums2]
count = 0
for i in nums1:
for j in nums2_:
count += 0 if i % j else 1
return count
第二题的难度提升在数量级在10万左右,暴力的话时间复杂度O(m*n)必然超时,那么不能使用模拟双层for循环,就需要分析数学上的原理。
对于一个数而言,如果可以被两个数的乘积整除,也就说明这个数的所有因子必然包含另外两个数。
再结合题目,k是固定的,k必然作为一个因数。整除k之后的商再进行因数分解,只要在nums2中出现过的,都计入。
选用哪种数据结构?字典是比较好的选择,因为因数的大小不固定且不一定连续,list的索引范围受到限制,其次,我们需要在遍历全部的因数的时候多次修改该因数出现的次数,高频访问的数据,用hash的字典能够有效节省时间。
(1)筛选出nums1中能够整除k的数字;
(2)在同一个循环step下分解商全部的因子,统计出现的次数作为value,因子作为key到字典;
(3)遍历全部的nums2,只要是字典中的key值,就把其value计入结果。
class Solution:
def numberOfPairs(self, nums1: List[int], nums2: List[int], k: int) -> int:
cnt = defaultdict(int)
for i in nums1:
if i % k:
continue
i //= k
for d in range(1, isqrt(i) + 1):
if i % d:
continue
cnt[d] += 1
if d ** 2 < i:
cnt[i//d] += 1
return sum(cnt[j] for j in nums2)