重塑矩阵
题目描述
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]
输入:mat = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]
蠢蛋解题思路
先把二维数组总元素个数求出来mn判断是否等于rc即判断是否是合法变换,然后把二维数组转换为一维数组,然后再两层遍历转换为r*c的二维数组
蠢蛋代码
lass Solution {
public int[][] matrixReshape(int[][] mat, int r, int c) {
int m= mat.length;
int n=mat[0].length;
if (m*n!=r*c) return mat;
int []a=new int[m*n];
int i=0;
for (int []b:mat) {
for (int d:b) {
a[i]=d;
i++;
}
}
i=0;
int[][] resault = new int[r][c];
for (int j = 0; j < r; j++) {
for (int k = 0; k < c; k++) {
resault[j][k]=a[i];
i++;
}
}
return resault;
}
}
正经解法
进行判断合法性之后直接将原矩阵和目标矩阵对应元素位置进行映射,映射规则:
对于 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 < n*m; i++ {
ans[i/c][i%c] = nums[i/m][i%m]
}
return ans
}