贺胖娇的编程之旅......

566. 重塑矩阵

2020.09.03

题目来源: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 <= mat[i][j] <= 1000 1 <= r, c <= 300

自行解法

分析

最终的目的是把矩阵按照给定的r,c重新生成,那么有几个可以以下结论:
当r * c != m * n 时,代表不符合规范,直接输出原有的矩阵;
由于新的矩阵可以理解为按照r * c的大小放入的二维数组,那么把以前的数组直接拆成一维数组,挨个放入是最容易想到的简单思路。
根据这个思路可以实现php代码如下:

class Solution {

    /**
     * @param Integer[][] $mat
     * @param Integer $r
     * @param Integer $c
     * @return Integer[][]
     */
    function matrixReshape($mat, $r, $c) {
        if ($this->checkIfCanUse($mat, $r, $c)) {
            $ret = [];
            $originArr = array_reduce($mat, 'array_merge', array());
            for ($i = 0; $i < $r; $i++) {
                $ret[$i] = [];
                $ret[$i] = array_merge($ret[$i], array_slice($originArr, $i * $c, $c));
            }
            return $ret;
        }
        return $mat;
    }
    function checkIfCanUse($mat, $r, $c)
    {
        $m = count($mat);
        $n = ($m > 0) ? count($mat[0]) : 0;
        if ($m * $n == $r * $c) {
            return true;
        }
        return false;
    }
}

其他优质解法

发表评论