LeetCode 566 重塑矩阵
1.题目描述:
在 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]]
2.题解:
对于一个行数为m,列数为n, 行列下标都从0开始标号的二维数组,将其中每个元素(i, j ),映射到整数区域内,并且按照优先队列的顺序一一对应着[0, mn) 中的每一个数。
- 如果 mn != i j , 无法进行重塑,返回原数组
- 否则,第x个元素在nums中对应的下标是 ( x/n , x % n ), 而在新的重塑矩阵中对应的下标为(x / c , x % c )。直接进行赋值即可。
时间复杂度:O(mn)
空间复杂度:O(1)
c++:
class Solution {
public:
vector<int>ans ;
vector<vector<int>> matrixReshape(vector<vector<int>>& mat, int r, int c){
int n = mat.size(), m = mat[0].size() ;
if ( n *m != r * c) return mat ;
vector<vector<int>> ans(r, vector<int>(c)) ; // 初始化行数r,与列数c
for ( int i = 0 ; i < n * m; i++)
ans[i/c][i%c] = mat[i/m][i%m]; //对每个元素标号排序
return ans ;
}
};
Golang:
func matrixReshape(mat [][]int, r int, c int) [][]int {
n, m := len(mat), len(mat[0])
if n * m != r * c {
return mat
}
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] = mat[i/m][i%m]
}
return ans
}
原题:重塑矩阵