在问 · 算法题解

867. 转置矩阵

题目描述

输入 m x n 的二维整数数组 matrix。

返回它的转置,即一个 n x m 的矩阵,第 j 行第 i 列的值等于 matrix[i][j]。直观上,就是把矩阵沿左上到右下的主对角线翻过来,行变成列。

示例 1
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]
示例 2
输入:matrix = [[1,2,3],[4,5,6]]
输出:[[1,4],[2,5],[3,6]]

解释:2 x 3 的矩阵转置后变成 3 x 2。

数据范围

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 1000
  • 1 <= m * n <= 10^5
  • -10^9 <= matrix[i][j] <= 10^9

解题思路

m × n 矩阵的转置是 n × m 矩阵。新建 n 行 m 列的 res,遍历原矩阵每个格子 (i, j),把它放到 res[j][i]。矩阵不一定是方阵,所以不能原地交换。

为什么正确

处理完原矩阵的前 i 行后,res 的前 i 列已经填好:res 的第 i 列正是原矩阵的第 i 行。

复杂度分析

时间 O(m·n);结果矩阵占 O(m·n) 空间,除此之外 O(1)。

易错点

结果的形状是 n × m 而不是 m × n;对非方阵做“原地交换 matrix[i][j] 与 matrix[j][i]”会越界或丢数据。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

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

载入编辑器,自己跑一遍 →

数学 专题的其他题目

查看 数学 全部题目 →