给出一个n
整数a0, a1, .. an
和一个正整数k
的数组。查找和打印(i,j)
对的数量,其中i+j
可被k
(即i+j % k == 0
)均分。此问题已从here中取得。在O(n)时间的数组中找到可分式总和对
我们需要O(n)
时间的解决方案。
一个解释是,我们可以通过将元素分成桶来根据他们的模块k来做到这一点。例如,你具备的要素:1 3 2 6 4 5 9 and k = 3
mod 3 == 0 : 3 6 9
mod 3 == 1 : 1 4
mod 3 == 2 : 2 5
然后,说:
现在,你可以对像这样:与国防部3 == 0元素将匹配 与元素(3 - 0)模K = 0,在MOD 3 == 0列表,以便其他元件,像这样: (3,6)(3,9)(6,9)
此外:
将会有n *(n-1)/ 2个这样的对,其中n是 列表的长度,因为列表是相同的并且i!= j。 mod 3 == 1的元素将与(3-1)mod k = 2的元素匹配,因此 mod 3 == 2列表中的元素如下所示:(1,2)(1,5)(4 ,2)(4,5)
它是有道理的(3, 6) (3, 9) (6, 9) (all items in the 0th bucket be paired)
自(a + b)% k = 0 = a % k + b % k
。
什么是不明确的是,其他对是如何通过组合第一(mod 3 == 1)和第二(mod 3 == 2)桶中的元素生成的,为什么会有n *(n - 1)/ 2对。 是否有另一种(更好)的方法?
这个问题适用于Math Stackexchange,这个问题在发布问题之前并不知晓。
恕我直言,这不是一个Python相关的问题,但数学。 –
“然后它说:” - *其中*是以下文字说的?我没有看到它, –
你没有列出我