在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 100
-1000 <= mat[i][j] <= 1000
1 <= r, c <= 300
我的代码:
func matrixReshape(mat [][]int, r int, c int) [][]int {
m, n := len(mat), len(mat[0])
if m * n > r * c{
return mat
}else{
if m <= r && n <= c{
return mat
}else{
k, l := 0, 0
ans := make([][]int, r)
for i := 0; i < r; i++{
ans[i] = make([]int, c)
}
for i := 0; i < m; i++{
for j := 0; j < n; j++{
if l == c{
k++
l = 0
}
ans[k][l] = mat[i][j]
l++
}
}
return ans
}
}
}
官方题解:
方法一:二维数组的一维表示
思路与算法
对于一个行数为 m,列数为 n,行列下标都从 0 开始编号的二维数组,我们可以通过下面的方式,将其中的每个元素 (i, j) 映射到整数域内,并且它们按照行优先的顺序一一对应着 [0, mn) 中的每一个整数。形象化地来说,我们把这个二维数组「排扁」成了一个一维数组。如果读者对机器学习有一定了解,可以知道这就是 flatten 操作。
这样的映射即为:
(i,j)→i×n+j
同样地,我们可以将整数 x 映射回其在矩阵中的下标,即
i=x / n
j=x % n
其中 /表示整数除法,% 表示取模运算。
那么题目需要我们做的事情相当于:
将二维数组nums 映射成一个一维数组;
将这个一维数组映射回 r 行 c 列的二维数组。
我们当然可以直接使用一个一维数组进行过渡,但我们也可以直接从二维数组nums 得到 r 行 c 列的重塑矩阵:
设nums 本身为 m 行 n 列,如果mn ≠rc,那么二者包含的元素个数不相同,因此无法进行重塑;
否则,对于 x∈[0,mn),第 x 个元素在 nums 中对应的下标为(x / n,x % n),而在新的重塑矩阵中对应的下标为 (x / c,x % c)。我们直接进行赋值即可。
官方代码:
func matrixReshape(nums [][]int, r int, c int) [][]int{
n, m := len(nums), len(nums[0])
if n * m != r * c{
return nums
}
ans := make([][]int, r)
for i := range ans{
ans[i] = make([]int, c)
}
for i := 0; i < m * n; i++{
ans[i / c][i % c] = nums[i / m][i % m]
}
return ans
}