/** * Временная сложность: O(log(m * n)) * - Мы рассматриваем матрицу как один отсортированный массив длиной m*n. * - Бинарный поиск делит область поиска пополам на каждом шаге. * * Пространственная сложность: O(1) * - Мы используем только несколько переменных для хранения индексов. * - Дополнительная память не зависит от размера входных данных. */var searchMatrix = function(matrix, target) { if (!matrix.length || !matrix[0].length) return false; const rows = matrix.length; const cols = matrix[0].length; // Представляем матрицу как одномерный массив длиной m * n let left = 0; let right = rows * cols - 1; while (left <= right) { // Находим середину виртуального массива const mid = Math.floor((left + right) / 2); // Преобразуем индекс mid обратно в координаты матрицы [row][col] // Важно: делим на количество СТОЛБЦОВ (длину строки) const row = Math.floor(mid / cols); const col = mid % cols; const value = matrix[row][col]; if (value === target) { return true; } else if (value < target) { left = mid + 1; } else { right = mid - 1; } } return false;};