Python 检查元素对和是否可整除

Python 检查元素对和是否可整除,python,algorithm,Python,Algorithm,我正试图找到一个更有效的解决这个问题的方法: 问题陈述是: 给定一个整数数组和一个数字k,如果给定数组可以分成若干对,使得每一对的和可以被k整除,则编写一个返回true的函数 我的解决方案(只是主要逻辑): 很明显,这是一个在O(n^2)中有效的蛮力解决方案。我基本上是将访问过的对添加到列表中 但还有比这更有效的解决方案吗?谢谢你的时间 对于每个数字,您可以通过取N mod K来检查其被K除后的余数。然后,两个数之和可以被K整除,它们的余数之和必须是K的倍数(包括0)。所以,如果我们跟踪每个可

我正试图找到一个更有效的解决这个问题的方法:

问题陈述是:

给定一个整数数组和一个数字k,如果给定数组可以分成若干对,使得每一对的和可以被k整除,则编写一个返回true的函数

我的解决方案(只是主要逻辑):

很明显,这是一个在O(n^2)中有效的蛮力解决方案。我基本上是将访问过的对添加到列表中


但还有比这更有效的解决方案吗?谢谢你的时间

对于每个数字,您可以通过取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)