【发布时间】:2021-12-10 19:22:16
【问题描述】:
我有一个n 正整数数组。我想计算大小为k 模p 的所有连续子数组产品的列表。例如以下数组:
a = [3, 12, 5, 2, 3, 7, 4, 3]
使用k = 3 和p = 12,所有k 大小的连续子数组产品的有序列表将是:
k_products = [180, 120, 30, 42, 84, 84]
模 p 我们有:
k_products_p = [0, 0, 6, 6, 0, 0]
我们可以使用滑动窗口轻松计算k_products。我们所要做的就是计算第一个k 大小的子数组的乘积,然后使用以下公式计算k_product 的下一个元素:
k_product[i] = k_product[i - 1] * a[i + k] / a[i - 1]
在形成整个列表之后,我们可以为每个i 计算k_product[i] % p 以得到k_product_p。而已。 O(n) 复杂度还不错。
但是如果a[i]的元素很大,k_product的元素可能会溢出,因此我们无法计算k_product_p。另外,我们不能做以下事情:
k_product[i] = ((k_product[i - 1] % p) * (a[i + k] % p) / (a[i - 1] % p)) % p // incorrect
那么有没有一种快速算法可以做到这一点?请注意,p 不一定是素数,也不一定是 a 的元素的互质数。
编辑:如 cmets 中所述,python 中不会溢出,但处理非常大的数字会很耗时。
【问题讨论】:
-
在某些情况下,先除后乘可能会有所帮助
-
在Python中,我相信应该没有
overflow的问题。一些关于此的帖子stackoverflow.com/questions/538551/… -
你是对的。但我认为复杂性会非常混乱。 @DanielHao
-
这是为什么呢? ~
...complexity will be quite messy?您仍然可以使用滑动窗口技术。解决它。对吗? -
是的,但 python 可能必须处理 100 位数字。我不认为这将是一个快速的解决方案。内存是另一个问题。 @DanielHao
标签: python arrays algorithm sliding-window modular-arithmetic