重塑矩阵

解法一

  1. 解题思路:

    • 把二维数组变成一位数组;
    • 然后 2 层循环赋值;
  2. 复杂度:

    • 时间复杂度:O(rc);
    • 空间复杂度:O(1),这里的空间复杂度不包含返回的重塑矩阵需要的空间;
  3. 代码实现:

    const matrixReshape = (mat, r, c) => {
      const newMat = [];
      // 将二维数组转化为一维数组
      for (let i = 0; i < mat.length; i++) {
        newMat.push(...mat[i]);
      }
    
      // 判断能否重塑成功
      if (r * c !== newMat.length) return mat;
    
      // 一共有r行
      for (let i = 0; i < r; i++) {
        const item = [];
        // 每行c个
        for (let j = 0; j < c; j++) {
          // 将c个元素从头部拿出,并放入暂存的item数组
          item.push(newMat.shift());
        }
        // 当前行收集完毕,推入新数组的尾部
        newMat.push(item);
      }
    
      return newMat;
    };
    

解法二(优化)

  1. 解题思路:

    • 行数:i/每组里面的个数;
    • 每行的元素序号:i%每组里面的个数;
  2. 复杂度:

    • 时间复杂度:O(rc);
    • 空间复杂度:O(1),这里的空间复杂度不包含返回的重塑矩阵需要的空间;
  3. 代码实现:

    var matrixReshape = function (nums, r, c) {
      const row = nums.length;
      const col = nums[0].length;
    
      // 判断能否重塑成功
      if (row * col != r * c) return nums;
    
      // 生成一个 row*col 的二维数组,以 0 填充
      const ans = new Array(r).fill(0).map(() => new Array(c).fill(0));
    
      for (let i = 0; i < row * col; ++i) {
        ans[Math.floor(i / c)][i % c] = nums[Math.floor(i / col)][i % col];
      }
    
      return ans;
    };
    
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 重塑矩阵
  2. 2. 解法一
  3. 3. 解法二(优化)