【发布时间】:2016-11-19 22:30:31
【问题描述】:
给定一个 1 索引数组 A,大小为 N,任意之间的距离 i 和 j 数组的 2 个索引由 |i−j| 给出。现在,根据这些信息,我需要为每个索引 i (1≤i≤N) 找到一个索引 j,这样 1≤j≤N、i≠j、GCD(A[i],A[j])>1。
如果一个索引i有多个这样的候选,必须找到索引j,使得i和之间的距离>j 是最小的。如果仍然存在多个候选,则打印满足上述约束的最小 j。
示例: 数组(A) 2 3 4 9 17
输出:3 4 1 2 -1
注意:数组大小可以大到 2*10^5。 并且每个数组元素可以取最大值 2*10^5 和最小值 1。
我应该最多可以在 1 秒内计算出来。
这是我的代码,但它超出了时间限制。有没有办法优化它。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class GCD {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine().trim());
int[] a = new int[n+1];
StringBuilder sb =new StringBuilder("");
String[] array = br.readLine().trim().split(" ");
for(int i=1; i<=n; i++){
a[i] = Integer.parseInt(array[i-1]);
}
int c,d;
l1: for(int i=1; i<=n; i++){
c = i-1;
d = i+1;
while((c>0||d<=n)){
if(c>0){
if(GCD(a[i],a[c])>1){
sb.append(c+" ");
continue l1;
}
}
if(d<=n){
if(GCD(a[i],a[d])>1){
sb.append(d+" ");
continue l1;
}
}
c--;
d++;
}
sb.append("-1 ");
}
System.out.println(sb);
}
static long GCD(int a, int b){
if(b==0)
return a;
return GCD(b, a%b);
}
}
【问题讨论】:
-
你注意到我的答案和 div 的答案实际上根本没有计算 GCD 吗?
标签: arrays algorithm greatest-common-divisor