Собесов

Transpose Matrix — транспонирование матрицы

АлгоритмыМатрицыЛёгкаяJunior

Условие

Дана прямоугольная матрица m × n. Верните её транспонированную версию (размер n × m): элемент [i][j] исходной матрицы становится элементом [j][i] результата.

Пример.

[[1,2,3],
 [4,5,6]]   →   [[1,4],
                 [2,5],
                 [3,6]]

Решение

Подход 1: создать новый массив

class Solution:
    def transpose(self, matrix: list[list[int]]) -> list[list[int]]:
        m, n = len(matrix), len(matrix[0])
        result = [[0] * m for _ in range(n)]
        for i in range(m):
            for j in range(n):
                result[j][i] = matrix[i][j]
        return result

Подход 2: zip

В Python:

def transpose(matrix):
    return [list(row) for row in zip(*matrix)]

zip(*matrix) распаковывает строки и собирает кортежи столбцов — это и есть транспонирование.

Сложность

  • Время: O(m * n) — каждый элемент копируется ровно один раз.
  • Память: O(m * n) на новую матрицу.

Можно ли «на месте»?

Только для квадратных матриц: для прямоугольной размер меняется (m × nn × m), и в общую память тот же буфер не помещается без сложных перестановок.

Для квадратной — обмен matrix[i][j] с matrix[j][i] для i < j:

n = len(matrix)
for i in range(n):
    for j in range(i + 1, n):
        matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

Подводные камни

  1. Спутать с поворотом на 90°. Это не одно и то же. Поворот = транспонирование + разворот строк.
  2. zip(matrix) без *. Без распаковки zip получит один аргумент-список, и результат будет странным. Нужен zip(*matrix).
  3. Невыровненные строки. zip остановится на самой короткой строке. На LeetCode таких входов нет, но в реальных данных надо проверять.

Эталонный ответ

Двойной цикл с result[j][i] = matrix[i][j] или питоновский [list(r) for r in zip(*matrix)]. O(mn) времени и памяти.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти