2015-08-05 2 views
0

Я работаю над проблемой в 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

Потому что мне нужно вернуть минимальное количество, которое должно быть найдено в обоих массивах. Если A [0] и B [0] различны, это не поможет. – Vintage

+0

попытайтесь рассмотреть этот ответ http://stackoverflow.com/questions/31828623/finding-common-minimum-value-between-two-arrays/31828954#31828954 –

+0

Все, что вам просто нужно сделать, это слить, сортировать, а затем получить первый index –

ответ

3

Я предлагаю изменить свою методологию здесь. Сортировка обоих массивов в начале стоит дорого. Найдите набор пересечений из двух массивов, а затем отсортируйте его и верните его минимальное значение, вот и все.

+0

Я собираюсь отметить этот ответ. Спасибо. Однако можно ли каким-либо образом изменить мой код в двух строках? Вот как я должен это делать. Я знаю, что пересечение лучше, но я должен использовать петли для какой-то странной причины ... – Vintage

+0

_ «Предполагалось сделать это» _? Это школьное задание? – Cerbrus

+0

Я работаю над проблемами программирования из студенческой книги. – Vintage

3

Давайте,

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

и запустить через петлю.

Ваш скрипт не работает.

Правильная логика должна быть, вы либо увеличиваете i, либо k в 1 итерации. Не так

Я хотел бы сделать что-то вроде,

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

Это ответ, сэр. Спасибо. – Vintage

1

Это должно работать. Просто замените первый 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

Смежные вопросы