Leetcode 566 重塑矩阵
题目描述:
在 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]]
解法:
代码:
class Solution {
public:
vector<vector<int>> matrixReshape(vector<vector<int>>& mat, int r, int c) {
//mat数组的行数
int m = mat.size();
//mat数组的列数
int n = mat[0].size();
if(m*n != r*c)
{
return mat;
}
vector<vector<int>> ans(r, vector<int>(c));
for (int x=0;x<m*n;x++)
{
ans[x/c][x%c]=mat[x/n][x%n];
}
return ans;
}
};
解题思路:
对于一个行数为 m,列数为 n,行列下标都从 0 开始编号的二维数组,我们可以将其中的每个元素 (i, j)映射到整数域内,并且它们按照行优先的顺序一一对应着 [0, mn) 中的每一个整数。形象化地来说,我们把这个二维数组「排扁」成了一个一维数组。
/表示整数除法,% 表示取模运算。
那么题目需要我们做的事情相当于:将二维数组 mat 映射成一个一维数组;将这个一维数组映射回 r 行 c 列的二维数组。
我们可以直接使用一个一维数组进行过渡,但我们也可以直接从二维数组 mat 得到 r行 cc列的重塑矩阵。
设 mat 本身为 m 行 n 列,如果 mn !=rc,那么二者包含的元素个数不相同,因此无法进行重塑;
否则,对于 x∈[0,mn),第 x 个元素在mat中对应的下标为 (x / n,x % n),而在新的重塑矩阵中对应的下标为 (x / c,x % c)。我们直接进行赋值即可。
则,对于 x∈[0,mn),第 x 个元素在mat中对应的下标为 (x / n,x % n),而在新的重塑矩阵中对应的下标为 (x / c,x % c)。我们直接进行赋值即可。