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

Finding common minimum value between two arrays

本文关键字:之间 最小值 数组 两个 查找      更新时间:2023-09-26

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

这应该可以工作。只需将第一个if替换为一个whilewhile循环通过阵列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

我们来看看,

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;
}

我建议在这里更改您的方法。一开始对这两个数组进行排序是非常昂贵的。找到两个数组的交集集,然后对其进行排序并返回其最小值,仅此而已。

// java code for this 
import java.util.Arrays;
public class CommonMinValue {
public static void main(String[] args) {
    int [] A = {1,5,6,7,8,9,11};
    int [] B = {11,51,16,7,18,19,161};
    
    int n = A.length;
    int m = B.length;;
    Arrays.sort(A);
    System.out.println(Arrays.toString(A));
    System.out.println(Arrays.toString(B));
    Arrays.sort(B);
    int commMin=-1;
    
    int i = 0;
    for (int k = 0; k < n;) {
         if (A[k] == B[i]) {
            commMin = A[k];
            break;
         }
        if (i < m - 1 && B[i] < A[k])
            i ++;
        else
            k ++;
       
    }
   System.out.println("Common minimum value "+commMin);
   
}

}