任务: A和B是自然数的数组。 A是递增排序的数组,B是随机排序的数组。 K是一些任意的自然数。找到一种有效的算法,它确定所有可能的索引对(i,j),使得A [i] + B [j] = K.
这种算法效率最高吗?
public static void main(String[] args) {
int A[] = { 1, 2, 3, 4, 6, 7, 8, 11, 13, 124};
int B[] = {4, 1, 10, 5};
int k = 10;
int i = 0, n = A.length, m = B.length;
ArrayList<String> result = new ArrayList<String>();
while (i < n){
if (A[i] >= k) {
break;
}else {
int j = 0;
while(j < m) {
if (A[i] + B[j] == k) {
result.add("i = " + i + " j = " + j);
}
j++;
}
}
i++;
}
for(int z = 0; z < result.size(); z++) {
System.out.println(result.get(z));
}
}
答案 0 :(得分:6)
不,算法效率不高。当break
a
A
中的k
大于a
时,您仍然必须测试b
和{{的所有组合在此之前,给你的算法一个复杂的O(mn),其中n是A
的元素数量,m是B
中的元素数量。
相反,我建议如下:
b
B
a = K - b
a
中A
的索引(如果存在)a
中存在A
,请打印a
和b
这利用了这样一个事实:自A
排序后,我们可以快速确定给定的b
,a
是否a + b = k
存在于A
1}}。反之亦然,因为B
是随机排序的。其总复杂度为O(m log n)。