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.lengthn == matrix[i].length1 <= m, n <= 10001 <= 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 resclass Solution {
public int[][] transpose(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
int[][] res = new int[n][m];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
res[j][i] = matrix[i][j];
}
}
return res;
}
}class Solution {
public:
vector<vector<int>> transpose(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<vector<int>> res(n, vector<int>(m));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
res[j][i] = matrix[i][j];
}
}
return res;
}
};func transpose(matrix [][]int) [][]int {
m, n := len(matrix), len(matrix[0])
res := make([][]int, n)
for j := range res {
res[j] = make([]int, m)
}
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
res[j][i] = matrix[i][j]
}
}
return res
}var transpose = function(matrix) {
const m = matrix.length, n = matrix[0].length;
const res = Array.from({length: n}, () => new Array(m).fill(0));
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
res[j][i] = matrix[i][j];
}
}
return res;
};function transpose(matrix: number[][]): number[][] {
const m = matrix.length, n = matrix[0].length;
const res: number[][] = Array.from({length: n}, () => new Array(m).fill(0));
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
res[j][i] = matrix[i][j];
}
}
return res;
}