准备
现有一个一维数组:{1,2,3,4,5,6,7,8,9}
转为 3*3 的二维数组:
{
1,2,3
4,5,6
7,8,9
}
我们不难看出:
一维数组第1个元素在数组中为 arr[0][0],
一维数组第3个元素在数组中为 arr[0][2],
一维数组第4个元素在数组中为 arr[1][0],
由于第(n+1)个元素下标为n,为此我们可以得出结论:
一维数组的第n个元素,在二维数组中表示为:arr[n / col][n % col]
题目引入
引用LeetCode的第566题,题意如下:
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
代码实现:
class Solution {
public int[][] matrixReshape(int[][] mat, int r, int c) {
// 安全性校验
int m = mat.length;
int n = mat[0].length;
// row*col不等于传递过来的数,不能组成新的维度数组
if ((m * n) != (r * c)) {
return mat;
}
// 程序走到这里,表明能组成新的维度数组
// 创建一个新的二维数组
int res[][] = new int[r][c];
// 遍历旧的二维数组
for (int i = 0; i < m * n; i++) {
// 由以上公式,我们可以推导出:
res[i / c][i % c] = mat[i / n][i % n];
}
return res;
}
}
代码实现二:
1、先将旧的二维数组转为一维数组;
2、再将一维数组转为按照规则实现的二维数组
public int[][] matrixReshape(int[][] mat, int r, int c) {
// 二维数组的行数
int n = mat.length;
// 二维数组的列数
int m = mat[0].length;
if ((n * m) != (r * c)) {
return mat;
}
int arr[] = new int[n * m];
int index = 0;
// 将二维数组转为一维数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr[index++] = mat[i][j];
}
}
// 将一维数组转变为二维数组
int res[][] = new int[r][c];
index = 0;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
res[i][j] = arr[index++];
}
}
return res;
}