Every day a Leetcode
题目来源:566. 重塑矩阵
解法1:二维数组间的映射
如上图所示,一个m*n的矩阵,按行优先映射成一个一维数组。
矩阵中点(i,j)在一维数组的下标为:x=i*n+j。
然后,我们在把这个一维数组按行优先映射成一个r*c的矩阵。
一维数组的下标为x的点在矩阵中的坐标为:i=x/c,j=x%c。
据此得到关系:ans[x/c][x%c]=mat[x/n][x%n];
当然,我们首先要判断mn是否等于rc,若不等,说明不能重塑,返回原矩阵。
代码:
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
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=r;
*returnColumnSizes=malloc(r*sizeof(int));
int **ans=malloc(r*sizeof(int*));
for(int i=0;i<r;i++)
{
(*returnColumnSizes)[i]=c;
ans[i]=malloc(c*sizeof(int));
}
for(int x=0;x<m*n;x++)
{
ans[x/c][x%c]=mat[x/n][x%n];
}
return ans;
}
结果: