查找乘积等于目标数的所有对

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 可以看出,当到达列表中的最后一个数字时,不可能有任何尚未找到的东西。

常规

原始列表中的重复项:例如,具有两个 4s 不会返回目标编号为 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。快速简单!当直接的解决方案几乎肯定更好时(当然,除非它用于实践/学校),因此没有必要将解决方案强加为分而治之的算法。

以上是关于查找乘积等于目标数的所有对的主要内容,如果未能解决你的问题,请参考以下文章

哈希表题目:数的平方等于两数乘积的方法数

和为S的两个数字

如何将迭代器指向向量中大于或等于目标数的元素

两个数和为某个数几个连续数等于某个数

亲密数

[算法]和为S的两个数字