Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
力扣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]]
提示:
m == mat.length n == mat[i].length 1 <= m, n <= 100 -1000 <= mati <= 1000 1 <= r, c <= 300
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
首先判断给定参数的 reshape 操作是否可行且合理,这就需要我们求出原本数组的长度m和宽度n。然后判断他们的乘积m乘n是否等于r乘c。如果不等就返回原来的数组,如果相等就将数组变形。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
不是,本程序的关键刚开始并不是一次写成的:
res[i/c][i%c] = mat[i/n][i%n];需要了解对应的关系。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
AC代码第二种是某位大佬的解法,大家自行体会...
三、AC 代码:
- Java
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[][] res = new int[r][c];
for(int i=0;i<m*n;i++){
res[i/c][i%c] = mat[i/n][i%n];
}
return res;
}
}
- C
int** matrixReshape(int** mat, int matSize, int* matColSize, int r, int c, int* returnSize, int** returnColumnSizes){
int m=matSize,n=*matColSize;
if(m*n!=r*c)
{
*returnSize=m;
*returnColumnSizes=matColSize;
return mat;
}
*returnSize=r;
*returnColumnSizes=(int*)malloc(sizeof(int)*r);
int **ret=malloc(sizeof(int*)*r);
int j=0,i=0,cnt=n+1,cnt1=c+1;
for(i=0;i<r;i++)
{
(*returnColumnSizes)[i] = c;
ret[j++]=malloc(sizeof(int)*c);
}
j=0;i=0;
int *p=mat[0];
int *p1=ret[0];
while(cnt!=m*n+n)
{
*p1=*p++;
p1++;
if(cnt%n==0&&cnt-m*n-n!=0&&m!=1)
p=mat[++j];
if(cnt1%c==0&&cnt1-m*n-c!=0)
p1=ret[++i];
cnt++;
cnt1++;
}
*p1=*p;
return ret;
}
四、总结:
本次刷题让我理解了数学方法有时候也挺重要的!