n
给你一个整数数组a0, a1, .. an
和一个正整数k
。找出并打印出(i,j)
和可被(Whis )i+j
整除的对数。这个问题是从这里开始的。k
i+j % k == 0
我们需要O(n)
及时解决。
一种解释是,我们可以通过根据它们的 mod 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
然后,据说:
现在,您可以像这样进行配对:具有 mod 3 == 0 的元素将与具有 (3 - 0) mod 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,在发布问题之前我不知道它的存在。