我正在尝试使用java解决ABCDEF,但我不断超时(TLE)。任何人都可以建议我如何提高效率。
问题如下:
您将获得一组介于-30000和30000(含)之间的整数S.
查找属于集合S的六元组总数(a,b,c,d,e,f),使其满足等式:
a * b + c =(f + e)d
输入
第一行包含整数N(1≤N≤100),即集合S的大小。
S的元素在接下来的N行中给出,每行一个整数。给定的数字将是截然不同的。
输出
输出合理的六元组总数。
我的解决方案是
public static void main(String args[]) throws Exception {
//a*b + c = (f+e)d
// -30000 and 30000 d!=0
Reader in = new Reader();
PrintWriter out = new PrintWriter(System.out, true);
int n = in.nextInt();
int[] arr = new int[n];
List<Long> lhs = new ArrayList<Long>(n * n * n);
List<Long> rhs = new ArrayList<Long>(n * n * n);
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
//calc lhs
for (int a = 0; a < n; a++) {
for (int b = 0; b < n; b++) {
for (int c = 0; c < n; c++) {
long res = arr[a] * arr[b] + arr[c];
lhs.add(res);
if (arr[c] != 0) {
res = (arr[a] + arr[b]) * arr[c];
rhs.add(res);
}
}
}
}
//cal RHS
Collections.sort(rhs);
Collections.sort(lhs);
int lIndex = 0, rIndex = 0;
int res = 0;
while (lIndex < lhs.size() && rIndex < rhs.size()) {
if (lhs.get(lIndex).equals(rhs.get(rIndex))) {
int lSize = 0;
Long lEl = lhs.get(lIndex);
int rSize = 0;
Long rEl = rhs.get(rIndex);
do {
++lSize;
++lIndex;
} while (lIndex < lhs.size() && lhs.get(lIndex).equals(lEl));
do {
++rSize;
++rIndex;
} while (rIndex < rhs.size() && rhs.get(rIndex).equals(rEl));
res += lSize * rSize;
} else if (lhs.get(lIndex) < rhs.get(rIndex)) {
++lIndex;
} else {
++rIndex;
}
}
out.println(res);
}
}
我上面所做的是计算方程的LHS和RHS的所有可能值,并计算RHS中每个LHS值的出现。
我还尝试只对RHS数组进行排序并在其中进行二进制搜索以查找结果,但仍然算法不是最佳的,无法通过所有测试用例。