我正在尝试找到一个更有效的解决方案: 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)中使用。我基本上是将访问对添加到列表中。
但是,有没有比这更有效的解决方案?谢谢您的宝贵时间!
答案 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
,则每次出现时我们都必须在零和非零之间切换。