题目描述:
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
一、解题思路
1.首先咱们得知道题给出的这一行int...都是什么意思,以下是我自己的理解:
mat是给你的二维数组,也是当操作不符合时需要输出的原始矩阵;
matSize是mat的行数
matColSize是一个数组,表示每一行的列数
r,s不解释,题目中有描述
而*returnSize和** returnColumnSizes我可能理解的不太对,这两个在力扣里边感觉挺常见的(其他可能也常见但是我刷题少没见过),一个*前边返回的是一个数,两个*返回的是一个数组?
然后我在别的大佬里看到的理解:是这样的(个人还是不太懂,目前会刷题就行,www)
returnColumnSizes //是一维数组的地址的地址
* returnColumnSizes //是一维数组的地址
(* returnColumnSizes)[i] //是一维数组的i个元素
2.第二个需要知道的就是怎么看元素在哪一行和那一列,也就是下边的:
ans[x/c][x%c]这个,x/c表示行,x%c表示列,这样就可以做题啦
二、代码
代码如下(示例):
int** matrixReshape(int** mat, int matSize, int* matColSize, int r, int c, int* returnSize, int** returnColumnSizes){
int m=matSize;//行
int n=matColSize[0];//列
if(m*n!=r*c){
*returnSize=matSize;
*returnColumnSizes=matColSize;
return mat;//不符合条件直接返回原始矩阵
}
//后边由于要重塑数组,所以returnSize and returnColumnSizes的重新赋值
*returnSize=r;
*returnColumnSizes=(int*)malloc(sizeof(int)*r);
int **ans=(int**)malloc(sizeof(int*)*r);//建立新的二维数组
int i;
for(i=0;i<r;i++)
{
(*returnColumnSizes)[i]=c;//给每i行赋值c,c为列
ans[i]=(int*)malloc(sizeof(int)*c);//开辟列的空间?用词不知道对不对
}
int x;
for(x=0;x<m*n;x++)
{
ans[x/c][x%c]=mat[x/n][x%n];
}
return ans;
}