时间复杂度为 o(m×n),因必须访问原矩阵每个元素一次并映射到转置位置;空间复杂度通常为 o(m×n)(新建矩阵),方阵原地转置可优化至 o(1)。

二维数组行列互换(即矩阵转置)的时间复杂度是 O(m × n),空间复杂度通常是 O(m × n)(生成新矩阵时),也可优化至 O(1)(原地转置,仅限方阵且允许修改原数组)。
时间复杂度为什么是 O(m×n)
必须访问原矩阵中每个元素恰好一次,将其放到转置后对应位置(matrix[i][j] → transposed[j][i])。
无论用嵌套循环、列表推导式还是内置函数,都逃不开遍历全部 m×n 个元素:
- 对 3×3 矩阵:需处理 9 次赋值
- 对 100×200 矩阵:需处理 20,000 次赋值
- 无法跳过任意元素,下界就是 Ω(m×n),所以时间复杂度紧确为 O(m×n)
空间复杂度取决于实现方式
常见三种情形:
- 新建矩阵(最常用):分配一个 n×m 的新二维结构,空间复杂度为 O(m×n)
-
原地转置(仅适用于方阵):只用常数个临时变量交换对称位置元素(如
(i,j)与(j,i)),空间复杂度为 O(1) - 流式/生成器方式(不存完整结果):边计算边使用,额外空间可降至 O(min(m,n)),例如按行生成转置后的某一行时缓存一列数据
实际性能还受内存访问模式影响
虽然理论复杂度相同,但不同写法运行速度可能差几倍:
- 按行遍历原矩阵(推荐):符合内存局部性,CPU 缓存友好
- 按列遍历原矩阵:频繁跨行跳转,缓存命中率低,尤其在大矩阵中明显变慢
- Python 中用
zip(*matrix)或列表推导式,底层仍逐元素访问,但由 C 实现,比纯 Python 循环快得多
非矩形数组需额外检查
若输入是“锯齿数组”(各行长度不等),直接按索引访问会报 IndexError。安全做法是先校验每行长度,或改用更鲁棒的构造逻辑(如基于最长行补 None),此时预处理带来常数级额外开销,不影响整体 O(m×n) 复杂度,但影响实际健壮性。











