您将获得一个大小为N的整数数组A.您将获得Q查询,其中每个查询由两个整数L,R表示。排除后,必须找到数组的gcd(最大公约数)从范围L到R的部分包括
我的方法:
public static int gcd(int a ,int b) {
if(b == 0) return a;
return gcd(b, a % b);
}
for(int j = 0; j < Q; j++) {
int l = in.nextInt();
int r = in.nextInt();
ans = 0;
for(int k = 1; k <= n; k++) {
if(k < l || k > r) ans = gcd(a[k], ans);
}
System.out.println(ans);
}
但是这种方法给了我时间限制超出错误我如何改进我的算法
答案 0 :(得分:2)
您可以在gcdPrefix
时间内为每个前缀和后缀(让我们称之为gcdSuffix
和O(n * log MAX_A)
)预先计算gcd(只需从左到右遍历数组并存储当前值gcd,然后从右到左做同样的事情)。 (L, R)
查询的答案是gcd(gcdPrefix[L - 1], gcdSuffix[R + 1]
)(因此每个查询的O(log MAX_A)
次操作)。总时间复杂度为O((n + q) * log MAX_A)
。我认为它应该足够快。