查找两个数组之间的公共最小值

时间:2015-08-05 09:33:16

标签: javascript arrays min minimum

我正在处理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;
}

3 个答案:

答案 0 :(得分:3)

我建议你在这里改变你的方法。 在开始时对两个阵列进行排序是很昂贵的。 找到两个数组的交集,然后对其进行排序并返回其最小值,即全部。

答案 1 :(得分:3)

我们来吧,

A = [ 1, 3, 5, 7]
B = [ 0, 0, 1, 4, 6]

并贯穿你的循环。

您的脚本失败

正确的逻辑应该是,您可以在1次迭代中递增ik。不是两个

我会做类似的事情,

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的当前元素,重复该过程。

&#13;
&#13;
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;
&#13;
&#13;