文章目录
矩阵
矩阵是二维数组相关的应用题型,常见的有矩阵水平翻转、矩阵对角线翻转、矩阵遍历等。
1. 重塑矩阵
1.1 题目描述

leetcode跳转:566. 重塑矩阵
1.2 方法一:简单模拟
借助一个一维数组用来保持按行列遍历的结果,然后再按照新的行列遍历生成即可。
public int[][] matrixReshape(int[][] mat, int r, int c) {
int m = mat.length;
int n = mat[0].length;
if (r * c != m * n) {
return mat;
}
// 按原行列遍历
int[] temp = new int[r * c];
int idx = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
temp[idx++] = mat[i][j];
}
}
// 按新行列遍历
int[][] ans = new int[r][c];
idx = 0;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
ans[i][j] = temp[idx++];
}
}
return ans;
}
1.3 方法二:原地遍历
方法一的在空间上需要额外开辟一个行×列大小的数组,实际上我们只需要根据行列遍历的一个公式即可完成。
假设有一个4×5的二维数组:

很明显,每一行的起始位置也就是:0、5、10、15 ,如果我们从下标0开始遍历,一直遍历到第19位的话,那么每一行的起始位置实际上就是:i / 5,而每一列就是i % 5。
所以,我们只需要完成的遍历一次数组的长度即可完成矩阵的重塑。
public int[][] matrixReshape(int[][] mat, int r, int c) {
int m = mat.length;
int n = mat[0].length;
if (r * c != m * n) {
return mat;
}
int[][] ans = new int[r][c];
for (int i = 0; i < r * c; i++) {
ans[i / c][i % c] = mat[i / n][i % n];
}
return ans;
}
2. 转置矩阵
2.1 题目描述

leetcode跳转:867. 转置矩阵
2.2 方法:模拟
按题意模拟即可,其实就是按行输出,变成按列输出而已。
class Solution {
public int[][] transpose(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int[][] ans = new int[n][m];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ans[j][i] = matrix[i][j];
}
}
return ans;
}
}
</

文章详细介绍了如何通过不同方法重塑矩阵、转置矩阵、矩阵置零以及旋转图像的算法,包括模拟和原地算法。涉及LeetCode问题566和867。
最低0.47元/天 解锁文章
546

被折叠的 条评论
为什么被折叠?



