给定一个整数列表,找到由除当前索引之外的所有元素的乘积组成的列表

Given a list of integers, find the list consisting of the product of all elements but the current index

我正在使用 Python 3.8.

考虑一个(严格)正整数的列表,例如

L = [1,2,3,4,5]

我的任务是计算一个新列表,使其第 i 个元素是 L 中除第 i 个元素之外的所有元素的乘积。因此,对于给定的 L,我们的结果将是

R = [120, 60, 40, 30, 24]

显然,我可以做到

R = [functool.reduce(operator.mul, [L[ix] for ix in range(len(L)) if ix != k]) for k in range(len(L))]

但是,这具有 二次 时间复杂度。

从数学上讲,简单地将 L 的所有元素相乘,然后通过将此乘积除以 L 的每个元素来构造 R 会更有效。当然,这有浮点精度限制,并且它在我的计算机上不适用于大型列表(len(L) 大约 10^4,数字在 1 到 1000 之间)。

有什么想法吗?请注意,如果第二种方法有效,时间复杂度会降低到 linear.

您很幸运,因为 Python 具有 任意精度 整数!所以你实际上可以将它们全部相乘然后除以给定的整数:

L = [1,2,3,4,5]

prod = 1
for el in L:
    prod *= el

R = [prod//el for el in L]

注意使用整数除法//。由于所有元素 el 都是 prod 的因子,因此这总是会导致精确除法。仅使用 / 会导致浮点除法,可能会引入错误。