我试图找到具有特定差异的数字列表中的对数。用列表说
1 2 3 4 5
和差异目标'2',我想打印数字'3',因为这个序列中有3对,差异为'2'。但是,我的代码速度非常慢 - 它会对所有对进行重复计算,因此我最终需要将解决方案除以2才能得到答案。有没有办法在不重复计算的情况下完成同样的任务?我很欣赏您可能拥有的任何见解。谢谢!代码打印在
下面 import sys
def main():
solutions=0
pairs=[]
for i in xrange(len(numbers)):
for j in xrange(len(numbers)):
if i!=j:
pairs.append([numbers[i], numbers[j]])
for pair in pairs:
if abs(pair[0]-pair[1])==k:
solutions+=1
else:
continue
return solutions/2
if __name__ == '__main__':
lines=sys.stdin.readlines()
n,k=map(int, lines[0].strip().split())
numbers=map(int, lines[1].strip().split())
print main()
答案 0 :(得分:3)
对于i
中的每个元素a
,您需要检查i-diff
是否也在a
中。对于~O(1)成员资格测试,我们可以使用一组。因此:
>>> a = [1,2,3,4,5]
>>> diff = 2
>>> a_set = set(a)
>>> sum(i-diff in a_set for i in a_set)
3
是O(len(a))。
[请注意,我使用了i-diff in a_set
bool
作为1
评估为int
的事实。这相当于sum(1 for i in a_set if i-diff in a_set)
。]
更新:我发现我认为这些数字是唯一的。如果他们不是,那没关系,我们可以使用collections.Counter
来保留多重性信息。
答案 1 :(得分:0)
如果对数组进行排序,只需通过遍历数组而不是进行O(n ^ 2)搜索就可以找到所有对。重复计算的原因是你使用abs
所以它不仅发现(1,3)而且发现(3,1)。
答案 2 :(得分:0)
首先对数组进行排序,然后对列表中的每个数字(num
)进行排序,您需要查找num-2
。我想快速的方法是binary search
。
因此,通过二进制搜索,您将获得O(n log(n))
解决方案。