Матрицы

Базовый Algorithms
≈ 2 мин чтения

Двумерные данные как массив строк

Матрицу в алгоритмических задачах удобно представлять двумерным массивом. Первый индекс выбирает строку, второй — столбец.

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6}
};

int value = matrix[1][2]; // 6

Для такой матрицы matrix.length — количество строк, а matrix[row].length — количество элементов в конкретной строке. Это различие важно: в Java двумерный массив технически является массивом массивов, поэтому длины строк могут отличаться.

Обход по строкам и столбцам

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

int sum = 0;

for (int row = 0; row < matrix.length; row++) {
    for (int col = 0; col < matrix[row].length; col++) {
        sum += matrix[row][col];
    }
}

Если матрица содержит rows строк и cols столбцов, полный обход прямоугольной матрицы требует O(rows × cols) времени, потому что посещается каждая ячейка.

Соседние ячейки и границы

Во многих задачах нужно смотреть на соседей текущей ячейки: сверху, снизу, слева или справа. Перед обращением к соседу необходимо проверить, что его координаты остаются внутри матрицы.

int row = 1;
int col = 1;

if (row > 0) {
    int top = matrix[row - 1][col];
}

if (col + 1 < matrix[row].length) {
    int right = matrix[row][col + 1];
}

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

Не предполагай, что все строки одинаковой длины. Если задача не гарантирует прямоугольную матрицу, границу столбцов нужно проверять через matrix[row].length для текущей строки.