这是hackerrank中的 HackWithInfy2019 中给出的问题。 从昨天开始,我一直困扰着这个问题。
您将获得N个整数数组。您必须找到一对(i,j)
从而最大化 GCD( 2 <= N <= 10 ^ 5 1 <= a [i] <= 10 ^ 5 我已经使用python尝试过此问题a[i],a[j]
)+(j - i
)的值
和1 <= i 约束为:
答案 0 :(得分:0)
这里是做到这一点的一种方法。
创建一个可变类MinMax
来存储最小值。和最大索引。
创建一个Map<Integer, MinMax>
用于存储分钟。和最大特定除数的索引。
对于a
中的每个值,找到a[i]
的所有除数,并相应地更新映射,以便MinMax
对象存储最小值。和最大具有该特定除数的数字的i
。
完成后,迭代地图并找到计算key + value.max - value.min
的结果最大的条目。
分钟和最大该条目的值就是您的答案。
答案 1 :(得分:0)
这是一种可行的方法:
result = 0
min_i = array[1 ... 100000] initialized to 0
for j in [1, 2, ..., n]
for d in divisors of a[j]
let i = min_i[d]
if i > 0
result = max(result, d + j - i)
else
min_i[d] = j
在这里,每个min_i[d]
的{{1}}是最小的d
,因此i
。我们在内部循环中使用它来为每个a[i] % d == 0
查找数组中具有d
的GCD至少为a[j]
的第一个元素。如果d
是j
最大的可能值之一,则当内部循环以等于所需GCD的gcd(a[i], a[j]) + j - i
运行时,d
将被设置为正确的值。答案。
小于或等于100,000的自然数的最大除数为128(请参见here)。因此,内部循环最多运行128 * 100,000 = 1280万次。我想这可以通过一些优化来实现(尽管可能不是在Python中)。
(要遍历除数,请使用筛子为1至100000中的每个整数预先计算最小的平凡除数。)