问题陈述 在号码线上有N个房屋(1个号码中可以有更多房屋)。如果两间房子之间的距离小于给定D的距离,则称它们为邻居(两间具有相同编号的房子之间的距离为1) 找到所有邻居的数量。
从数学上讲,问题可以归结为这一点。给定多重集N和数字D 查找它们之间的距离小于D
的房屋数量def main():
number_of_ppl,distance=map(int, input().split())
inputs=map(int,input().split())
numbers=sorted(inputs)
counter=0
sum=0
for x in range(0,len(numbers)):
for y in range(i+1,len(numbers)):
if abs(numbers[x]-numbers[y])<=distance:
counter +=1
else:
break
sum+=counter
counter=0
print(sum)
main()
此代码有效,但是由于时间不足,它在8个测试案例中的3个失败。我有什么想念的吗? 我怎样才能使这种算法更快? 我尝试使用字典,但结果相同
P.S如果有帮助,我可以在该程序失败的情况下发布测试用例
答案 0 :(得分:0)
您当前的代码不完整,但似乎您正在执行2个循环,如果距离足够大,则需要O(n ^ 2)来运行。可以将其减少为O(n log n)。请注意,当您按顺序迭代数字时,当您对arr [i]的邻居进行分析时,当查看arr [i + 1]的邻居时,它们将是相同的,也许还会更多。
def main():
number_of_ppl,distance=map(int, input().split())
inputs=map(int,input().split())
numbers = sorted(inputs)
sum = 0
pointer = 0
for idx, number in enumerate(numbers):
while pointer < len(numbers) and number + distance >= numbers[pointer]:
pointer += 1
sum += (pointer - idx)
print(sum)
main()