一、题目
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
示例 1:
输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]
示例 2:
输入:mat = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 100
-1000 <= mat[i][j] <= 1000
1 <= r, c <= 300
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reshape-the-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
第一种解法呢大家应该都能想到,就是两个数组用不同的指针遍历,然后把数填充进去。第二种解法值得一提,是从官方题解里学到的。
第一次判断两个矩阵容量是否一致,若一致那么大家想一下。矩阵的坐标是否可以由列数来决定呢?
答案是可以的,横坐标由当前是第几个数/列数,纵坐标由第几个数%列数,非常巧妙。
三、代码
解法一:
class Solution {
public int[][] matrixReshape(int[][] mat, int r, int c) {
int m = mat.length;
int n = mat[0].length;
if(m * n != r * c) {
return mat;
}
int[][] copy = new int[r][c];
int x = 0, y = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(y == c) {
x++;
y = 0;
}
copy[x][y++] = mat[i][j];
}
}
return copy;
}
}
解法二:
class Solution {
public int[][] matrixReshape(int[][] mat, int r, int c) {
int m = mat.length;
int n = mat[0].length;
if(m * n != r * c) {
return mat;
}
int[][] copy = new int[r][c];
for(int x = 0; x < m * n; x++) {
copy[x / c][x % c] = mat[x / n][x % n];
}
return copy;
}
}