思路:
题目晦涩难懂,此题的难点在于看懂出题人想要表述的内容。
作者真正想要表述的意思为:
长度为n的数组p,需从数组中取q轮数据x和y。每轮(轮次以i计,i在1和q-1之间)取数,x的取值范围为数组p的下标在l1[i]~r1[i]之间的元素值,y的取值范围为数组p的下标在l2[i]~r2[i]之间的元素值。满足min(x,y)==gcd(x,y)时,此轮数据的有效答案数+1。返回各轮次有效答案数的数组。
如下图所示:
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 n * @param q int整型 q * @param p int整型一维数组 p * @param l1 int整型一维数组 l1 * @param r1 int整型一维数组 r1 * @param l2 int整型一维数组 l2 * @param r2 int整型一维数组 r2 * @return int整型一维数组 */ public int[] PermutationQuery(int n, int q, int[] p, int[] l1, int[] r1, int[] l2, int[] r2) {
int[] ans_nums = new int[q];
for (int i = 0; i < q; i++) {//每轮次询问,共q轮
for (int j = l1[i]; j <= r1[i]; j++) {//x的下标范围
int x = p[j];
for (int k = l2[i]; k <= r2[i]; k++) {//y的下标范围
int y = p[k];
if (x % y == 0 || y % x == 0) {
if(x!=y){//x、y相等时不计最大公约数
ans_nums[i]++;
}
//System.out.println(i+" "+j+" "+k+" "+x+" "+y);
}
}
}
}
return ans_nums;
} }