阵列的GCD

时间:2015-01-03 09:23:40

标签: java algorithm greatest-common-divisor

您将获得一个大小为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);
}

但是这种方法给了我时间限制超出错误我如何改进我的算法

1 个答案:

答案 0 :(得分:2)

您可以在gcdPrefix时间内为每个前缀和后缀(让我们称之为gcdSuffixO(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)。我认为它应该足够快。