LeetCode566 - 重塑矩阵 | 算法练习系列

78 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

前言

最近发现很多数组相关的算法都和矩阵有点联系,今天来一道叫做重塑矩阵的算法简单题目,下面先看题目吧。

题目描述

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

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

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

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

 

示例 1:

image.png

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

输出:[[1,2,3,4]]

示例 2:

image.png

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

输出:[[1,2],[3,4]]

解题思路

这题的解题思路主要如下几点:

  • 首先从题目中可知存在两种情况,一种是重塑成功的情况,一种是不能重塑的情况,这两种情况的区分直接拿原来矩阵的横列相乘和想要重塑成的矩阵的横列乘积相比即可。
  • 如果原矩阵和重塑矩阵的横列乘积相等那么就说明可以重塑,那么现在只要把原矩阵的内容按正确的方式放入结果矩阵就可以了
  • 这里我是直接双层for循环来遍历原来矩阵,并且声明了x,y用来记录当前遍历到了哪里,y代表宗坐标,x代表横坐标,当y的值等于c的时候,x就要加1了,要不然就超出边界了,这时候一定要记得把y重新赋值为0,这样知道循环结束就得到了我们想要的结果 具体代码如下:
/**
 * @param {number[][]} mat
 * @param {number} r
 * @param {number} c
 * @return {number[][]}
 */
var matrixReshape = function(mat, r, c) {
    let m = mat.length,n= mat[0].length
    
    if(m*n===r*c){
        let result = new Array(r).fill(0).map(() => new Array(c).fill(0))//生成结果矩阵
        let x=0,y=0
        for(let i=0;i<m;i++){
            for(let j=0;j<n;j++){
               result[x][y]= mat[i][j]
               y++
               if(y>=c){
                   x++
                   y=0
               }
            }
        }
        return result
    }else{
        return mat
    }
};

运行结果:

image.png

总结

这题是一个简单题目,没什么复杂的逻辑,明确了是否可以重塑,然后按照特定的边界把原矩阵存入结果矩阵就可以了。