Найти минимальную разницу между элементами двухмерного массива

#1

Например есть двухмерный массив:
[366, 919, 350, 619]
[963, 869, 361, 762]
[906, 122, 946, 798]
[593, 713, 619, 373]

#2

Что не понятно в задаче, подходах к ней? Не понятно в чем вопрос.

#3

Здесь нужно пройтись циклом по всех элементах массива:
arr = [
[366, 919, 350, 619]
[963, 869, 361, 762]
[906, 122, 946, 798]
[593, 713, 619, 373]]
Как найти разницу между всеми элементами и найти минимальную?

#4

Как я понял вопрос про стратегию решения задачи, на него и отвечу:

Решение влоб было бы - взять каждый элемент, получить разницу с каждым элементом, потом найти минимальную разницу. Но этот подход опасен тем что вычислительная сложность такого алгоритма будет расти очень быстро с увеличением количества данных.

Поэтому будем “хитрить”. “минимальная разница”, как я понимаю, это минимальное “расстояние” между двумя точками. Иными словами - модуль от вычитания одного числа из другого. Т.е. минимальная возможная разница это 0.

Если всять все числа из вложенных массивов, сложить в один массив, отсортировать, то мы молучим такую последовательность, в которой “расстояние” между двумя соседними значениями - минимальное возможное. Остается только пробежаться по массиву и получить значения разниц между текущим и последующим элементом (не забыть взять ее по модулю) и сравнить результаты. Для оптимизации нужно прекратить цикл когда минимальная разница получится 0.

Стало понятно как подходить к задаче или остались “пробелы”?

#5

https://codepen.io/anon/pen/mgYWEj
Строки с 26 по 33.
Не выходит сложить в один массив.
Выводит пустой массив.

#6

Проверь что подаешь на вход. В теле функции все выглядит валидно.

#7

В параметры записал массив arr и все равно то самое. А что же тогда нужно ввести?

#8

Я намекаю что если проверить значениt ary, то окажется что массив-то пуст. Тогда неудивительно что console.log(diff(arr)) дает пустой массив. Следовательно нужно копать в направлении пустоты ary.

#9

Спасибо, понял и сделал так.
Правда все равно это так и двухуровневый массив.
function diff(ary) {
var newA = [];
ary.push(arr)
for (var i = 0; i < ary.length; i++){
newA.push(ary);
}
return newA;
}
console.log(diff(arr))

#10

А ты хочешь получить одноуровневый?

arr1.push(arr2) не добавит все элементы arr2 в arr1, а добавит arr2 целиком как элемент arr1. Нужен другой метод чтобы получить желаемый результат https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat

#11

Я подумал это нужно в одноуровневый массив.

#12

Я свой предыдущий комментарий отредактировал. Может из-за ошибки было непонятно что я имел в виду.

Согласно тому плану что я написал, массив должен быть одноуровневый.

#13

https://codepen.io/anon/pen/WWBOgY?editors=0012
Строки 91-92. Объединить получилось. Не в то место кода вписывал.
Строки 94-101 Получилось найти разницу между числами.
Спасибо
Теперь такой вопрос как найти среди них например 4 самых близких по значению к числу с индексом [5]?

#14

Я верно понял что задача - из массива чисел найти 4 самых близких чисел к числу синдексом X? Как думаешь можно подойти к этой задаче?

#15

Так как мне нужно что-бы это было при наведении на ячейку с числом. Добавлю эту переменную
let closest = oneLevArr.sort( (a, b) => Math.abs(h - a) - Math.abs(h - b) )[0];
в функцию onMoOv() (строка 49).
где, h - избранное число.
В основной функции matrix, в параметрах есть х. Это для выбора количества.
И вот как использовать массив с разницами не знаю. Так как они только между соседними значениями.

#16

Думаю нужно в целом пересмотреть подход к задаче. Потому что не достаточно только " Найти минимальную разницу между элементами двухмерного массива ", самой разницы недостаточно чтобы смоделировать решение.

Пиши новый тред с задачей, как ты ее моделируешь и в чем “загвоздка”.

#17