我正在处理Javascript中的问题。查找两个数组之间的公共最小值。但是,有人告诉我,这可能不适用于某些值。有什么问题?
function cmp(a, b) { return a - b; }
function findMinimum(A, B) {
var n = A.length;
var m = B.length;
A.sort(cmp);
B.sort(cmp);
var i = 0;
for (var k = 0; k < n; k++) {
if (i < m - 1 && B[i] < A[k])
i += 1;
if (A[k] == B[i])
return A[k];
}
return -1;
}
答案 0 :(得分:3)
我建议你在这里改变你的方法。 在开始时对两个阵列进行排序是很昂贵的。 找到两个数组的交集,然后对其进行排序并返回其最小值,即全部。
答案 1 :(得分:3)
我们来吧,
A = [ 1, 3, 5, 7]
B = [ 0, 0, 1, 4, 6]
并贯穿你的循环。
您的脚本失败。
正确的逻辑应该是,您可以在1次迭代中递增i
或k
。不是两个
我会做类似的事情,
for (var k = 0; k < n;) {
if (A[k] == B[i])
return A[k];
if (i < m - 1 && B[i] < A[k])
i += 1;
else
k += 1;
}
答案 2 :(得分:3)
这应该有效。只需将第一个if
替换为while
即可。 while
循环遍历数组B,直到找到一个大于A的最小元素的元素。然后外部for
循环遍历A以查找与B的当前元素匹配的任何元素或直到它到达的元素大于B的当前元素,重复该过程。
function cmp(a, b) {
return a - b;
}
function findMinimum(A, B) {
var n = A.length;
var m = B.length;
A.sort(cmp);
B.sort(cmp);
var i = 0;
for (var k = 0; k < n; k++) {
while (i < m - 1 && B[i] < A[k])
i += 1;
if (A[k] == B[i])
return A[k];
}
return -1;
}
findMinimum([1,3,5,7], [0,0,1,4,9]); // 1
findMinimum([3,5,7,9], [1,2,4,7,10]); // 7
&#13;