Python 检查元素对和是否可整除
我正试图找到一个更有效的解决这个问题的方法: 问题陈述是: 给定一个整数数组和一个数字k,如果给定数组可以分成若干对,使得每一对的和可以被k整除,则编写一个返回true的函数 我的解决方案(只是主要逻辑): 很明显,这是一个在O(n^2)中有效的蛮力解决方案。我基本上是将访问过的对添加到列表中Python 检查元素对和是否可整除,python,algorithm,Python,Algorithm,我正试图找到一个更有效的解决这个问题的方法: 问题陈述是: 给定一个整数数组和一个数字k,如果给定数组可以分成若干对,使得每一对的和可以被k整除,则编写一个返回true的函数 我的解决方案(只是主要逻辑): 很明显,这是一个在O(n^2)中有效的蛮力解决方案。我基本上是将访问过的对添加到列表中 但还有比这更有效的解决方案吗?谢谢你的时间 对于每个数字,您可以通过取N mod K来检查其被K除后的余数。然后,两个数之和可以被K整除,它们的余数之和必须是K的倍数(包括0)。所以,如果我们跟踪每个可
但还有比这更有效的解决方案吗?谢谢你的时间 对于每个数字,您可以通过取N mod K来检查其被K除后的余数。然后,两个数之和可以被K整除,它们的余数之和必须是K的倍数(包括0)。所以,如果我们跟踪每个可能的余数,并确保每个余数都与它的否定模k匹配,我们就可以看到配对是否可能
def isPairable(array, k):
modK = [0] * k
for n in array:
modK[ n % k] += 1
modK[-n % k] -= 1
if n % k == -n % k:
modK[n % k] ^= 1
return not any(modK)
在这里,
modK
保存以k为模的余数的和计数,对于每个数字,我们增加n%k
余数的计数,减少求反-n%k
,以说明我们要配对的元素。如果n%k==-n%k
,则我们必须在每次出现时在零和非零之间切换。如果您对解决方案的工作情况感到满意,并且只想要更好的算法,请查看此链接。它描述了一种更有效的方法来使用哈希
。好主意。Algo有几种失效模式。能提供一些反例吗?如果我知道错在哪里,我会非常乐意纠正它。啊,当k==n/2时,它对同一个元素进行加减。数组=[3],k=6。我会解决的-谢谢提醒。仍然至少有一种故障模式:k=8,data=[8,12],谢谢@spinkus,修复了。我不再试图变得聪明/高效,而是明确地写出了edge案例。
def isPairable(array, k):
modK = [0] * k
for n in array:
modK[ n % k] += 1
modK[-n % k] -= 1
if n % k == -n % k:
modK[n % k] ^= 1
return not any(modK)