查找乘积等于目标数的所有对
Posted
技术标签:
【中文标题】查找乘积等于目标数的所有对【英文标题】:Finding all pairs that have the product equal to the target number 【发布时间】:2021-09-05 18:22:15 【问题描述】:我知道有一个详尽的解决方案可以遍历每个数字,但是如何实现分而治之的方法呢?
使用不重复数字的整数数组和目标乘积整数,返回一组数字,其中包括乘积等于目标数字的所有对。
def product_pair(num_arr, product):
"""
:type num_arr: List[int]
:type product: int
:rtype: List[int]
"""
Example 1. Product_pair([3, 5, 9, 10, 23, 53], 20) => []
Example 2. Product_pair([10, 2, 9, 30, 5, 1], 10) => [10, 2, 5, 1]
【问题讨论】:
必须是pairs(即2个数字)还是还可以更多? 【参考方案1】:你可以这样做:
def f(lst, n):
lst = list(filter(lambda x: x<=n, lst)) # Note 3
res = []
seen = set()
for i, x in enumerate(lst[:-1]): # Note 4
if x in seen:
continue
rem = n / x
if rem in lst[i+1:]: # Note 1, 2
seen.add(rem)
res.extend([x, int(rem)])
return res
对于您的示例,产生:
print(f([3, 5, 9, 10, 23, 53], 20)) # -> []
print(f([10, 2, 9, 30, 5, 1], 10)) # -> [10, 1, 2, 5]
备注
-
优化会员测试;您只在当前元素之后的列表切片中查找成员资格。如果以前有什么东西,你早就找到了。
我在这里假设您的候选人列表仅包含整数。
您可以过滤掉大于目标数字的数字。这些是不可能找到与之互补的整数的。
从注释 1 可以看出,当到达列表中的最后一个数字时,不可能有任何尚未找到的东西。
常规
原始列表中的重复项:例如,具有两个4
s 不会返回目标编号为 16
的 (4, 4)
结果。
这绝对不是最快的,但也不会太慢。
【讨论】:
另外,您的会员资格测试并不理想。使用 dict 代替剩余列表将是 O(1) 而不是 O(n)【参考方案2】:好吧,我不太确定分而治之,但这会非常有效且非常简单:
def product_pair(num_arr, product):
value_set = set(num_arr)
sol = [n for n in num_arr if product/n in value_set]
return sol
【讨论】:
+1。快速简单!当直接的解决方案几乎肯定更好时(当然,除非它用于实践/学校),因此没有必要将解决方案强加为分而治之的算法。以上是关于查找乘积等于目标数的所有对的主要内容,如果未能解决你的问题,请参考以下文章