給出一個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相關的問題,但數學。 –
「然後它說:」 - *其中*是以下文字說的?我沒有看到它, –
你沒有列出我