一、环境说明
- 本文是 LeetCode 566题 : 重塑矩阵,使用c语言实现。
- 模拟。
- 测试环境:Visual Studio 2019。
二、代码展示
//两种做法
//使用一维数组保存原二维矩阵。O(n)空间
//使用小学奥数/线性代数,映射原二维矩阵和新二维矩阵的元素。O(1)空间
int** matrixReshape(int** mat, int matSize, int* matColSize, int r, int c, int* returnSize, int** returnColumnSizes){
//改变矩阵形状。
if(r*c!=matSize*(matColSize[0])){//不能改变,输出原矩阵
*returnSize = matSize;
*returnColumnSizes = matColSize;
return mat;
}
int **ans = (int**)calloc(r,sizeof(int*));
returnSize[0] = r;
returnColumnSizes[0] = (int*)calloc(r,sizeof(int));
for(int i = 0;i<r;i++){//初始化新矩阵
returnColumnSizes[0][i] = c;
ans[i]=(int*)calloc(c,sizeof(int));
}
for(int i = 0;i<r*c;i++){//新矩阵赋值
ans[i/c][i%c] = mat[i/matColSize[0]][i%matColSize[0]];
}
return ans;
}
三、思路分析
- 重塑矩阵,考察矩阵元素位置与列的对应关系。
- 想象一个 m ∗ n m*n m∗n的矩阵,按行序,从 0 0 0行到 m − 1 m-1 m−1行,首位相接放入一维数组 n u m s nums nums,那么数组大小是 m ∗ n m*n m∗n。用 i i i表示数组的某个元素,数组和矩阵的映射关系是 m a t r i x [ i / c o l u m n ] [ i % c o l u m n ] = n u m s [ i ] matrix[i/column][i\%column]=nums[i] matrix[i/column][i%column]=nums[i]
- 对于矩阵压缩得到的一维数组,数组的 i i i只和矩阵的列 c o l u m n column column对应。
- 同理,我们也可以用矩阵 c o l u m n column column得到对应数组的 i i i。
- 利用数组做中间使者,等价一下,两个矩阵也有列和列对应的关系。
- 知道列和列存在对应关系,看代码就行~
四、代码分析
- 理解思路很重要!
- 博主欢迎读者在评论区留言,作为日更博主,看到就会回复的。
五、AC
六、复杂度分析
- 时间复杂度: O ( m ∗ n ) O(m*n) O(m∗n) , m a t mat mat数组的大小= m ∗ n m*n m∗n。一次遍历,通过 m a t mat mat建立 a n s ans ans的时间复杂度是 O ( m ∗ n ) O(m*n) O(m∗n)。
- 空间复杂度: O ( 1 ) O(1) O(1),不考虑保存答案的矩阵,没有使用额外的线性空间,空间复杂度 O ( 1 ) O(1) O(1)。
本文含有隐藏内容,请 开通VIP 后查看