Условие
Дана прямоугольная матрица 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 × n → n × 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]Подводные камни
- Спутать с поворотом на 90°. Это не одно и то же. Поворот = транспонирование + разворот строк.
zip(matrix)без*. Без распаковкиzipполучит один аргумент-список, и результат будет странным. Нуженzip(*matrix).- Невыровненные строки.
zipостановится на самой короткой строке. На LeetCode таких входов нет, но в реальных данных надо проверять.
Эталонный ответ
Двойной цикл с result[j][i] = matrix[i][j] или питоновский [list(r) for r in zip(*matrix)]. O(mn) времени и памяти.