力扣566. 重塑矩阵

159 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

力扣566. 重塑矩阵

一、题目描述:

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例 1:

img

输入:mat = [[1,2],[3,4]], r = 1, c = 4 输出:[[1,2,3,4]] 示例 2:

img

输入: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… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    首先判断给定参数的 reshape 操作是否可行且合理,这就需要我们求出原本数组的长度m和宽度n。然后判断他们的乘积m乘n是否等于r乘c。如果不等就返回原来的数组,如果相等就将数组变形。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是,本程序的关键刚开始并不是一次写成的:

     res[i/c][i%c] = mat[i/n][i%n];
    

    需要了解对应的关系。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    AC代码第二种是某位大佬的解法,大家自行体会...

三、AC 代码:

  1. 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;
     }
 }

image-20220319134041239

image-20220319134052479

  1. 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;
 }

image-20220319134659073

image-20220319134709826

四、总结:

本次刷题让我理解了数学方法有时候也挺重要的!