题目来源: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;
}
}