重塑矩阵


重塑矩阵

题目

1
2
3
4
5
6
7
8
9
10
11
12
在 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]]

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
思路:
将二维数组当成一维数组遍历,数量/列数决定所在行,数量%列数决定所在列,类似于求几进制的概念
例如 7*8的矩阵,总数56,从0开始遍历,0的位置是[0,0],1的位置是[0,1],8的位置是[1,0]

代码:
/**
* @param Integer[][] $mat
* @param Integer $r
* @param Integer $c
*
* @return Integer[][]
*/
function matrixReshape($mat, $r, $c)
{
$w = count($mat);
$h = count($mat[0]);

if ($w * $h != $r * $c) {
return $mat;
}

$res = [];
for ($i = 0; $i < $w * $h; $i++) {
// 将二维数组当成一维数组遍历,总数量/列数决定所在行,总数%列数决定所在列
$res[$i / $c][$i % $c] = $mat[$i / $h][$i % $h];
}

return $res;
}