检查元素对是否可整

时间:2018-06-29 21:26:01

标签: python algorithm

我正在尝试找到一个更有效的解决方案: https://practice.geeksforgeeks.org/problems/array-pair-sum-divisibility-problem/0

问题陈述是:

给出一个整数和一个数字k的数组,编写一个函数,如果给定的数组可以分成几对,则每对之和可被k整除,则该函数返回true。

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

for i in range(0,n):
        for j in range(i+1,n):
            if((a[i]+a[j])%k==0 and j not in res):
                res[i]=a[i]
                res[j]=a[j]
if(len(res)==n):
    print("True")
else:
    print("False")`

很明显,这是一种蛮力解决方案,可以在O(n ^ 2)中使用。我基本上是将访问对添加到列表中。

但是,有没有比这更有效的解决方案?谢谢您的宝贵时间!

1 个答案:

答案 0 :(得分:3)

对于每个数字,可以通过取数字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,以说明元素d与。如果为n % k == -n % k,则每次出现时我们都必须在零和非零之间切换。