【发布时间】:2017-07-24 10:38:14
【问题描述】:
给定两个数组A和B,每个数组包含n个元素。选择一对元素 (x, y) 使得:
• x 属于数组 A
• y 属于数组B
• GCD(x, y) 是所有对中的最大值 (x, y)。
如果有不止一对这样的对具有最大 gcd,则选择总和最大的一对。打印这个最大和对的元素之和。
这是来自 Hackerrank weekofcode34 的问题。
from fractions import gcd
from itertools import product
n = int(input().strip()) #two arrays of equal length
A = set(map(int, input().strip().split(' '))) #array1
B = set(map(int, input().strip().split(' '))) # arry2
output_sum=[]
output_GCD=[]
c=list(product(A,B))
for i in c:
temp1=i[0]
temp2=i[1]
sum_two=temp1+temp2
temp3=gcd(temp1,temp2)
output_GCD.append(temp3)
output_sum.append(temp1+temp2)
temp=[]
for i in range(len(output_GCD)):
if(output_GCD[i]==max(output_GCD)):
temp.append(output_sum[i])
print(max(temp))
此解决方案适用于较小的条件,并且我在大多数测试用例中都超时,请帮助我如何改进我的解决方案。
【问题讨论】:
-
不确定这是否更快,但不是计算每一对的 GCD (O(n²)),也许只是计算 A 中所有数字的所有除数,将它们存储在映射中 @ 987654323@,然后对于 B 中的所有数字,再次计算所有除数并获得地图中已经存在的最大除数。
-
您可以在每个数组中删除与除法相关的非最大元素以减少比较次数。
标签: algorithm python-3.x greatest-common-divisor