原题链接如下:
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
题解1(笨方法):
//Java版本
class Solution {
public int[][] matrixReshape(int[][] mat, int r, int c) {
int rowLength = mat.length;
int colLength = mat[0].length;
if(rowLength * colLength != r * c){
return mat;
}
int[][] result = new int[r][c];
int rPos = 0, cPos = 0;
for(int i = 0; i < rowLength; i++){
for(int j = 0; j < colLength; j++){
result[rPos][cPos] = mat[i][j];
if(++cPos >= c){
rPos++;
cPos = 0;
}
}
}
return result;
}
}
//c++版本
class Solution {
public:
vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
int m = nums.size()
int n = nums[0].size();
vector<vector<int>> ans(r,vector<int>(c,0));
if(r*c != m*n)
return nums;
int rPos = 0,cPos = 0;
for(int i = 0;i <m;++i){
for(int j = 0;j <n;++j){
ans[rPos][cPos] = nums[i][j];
if(++cPos>=c){
rPos++;
cPos =0;
}
}
}
return ans;
}
};
这种方法属于是暴力法了,虽然思路上并没有特别巧妙,题解二虽然运用了小技巧,但是由于多次除法和取模操作,导致运行时间上反倒是第一种暴力法更加优胜一点
题解2(二维数组与一维数组的相互映射):
如何创建一个二维的vector数组:(64条消息) C++ 动态二维数组(二维vector)_Tyler_Zx的博客-CSDN博客_c++vector二维数组
class Solution {
public:
vector<vector<int>> matrixReshape(vector<vector<int>>& mat, int r, int c) {
//首先判断m*n是否等于r*c
int m = mat.size();
int n = mat[0].size();
if(m*n != r*c){
return mat;
}
//创建一个新的二阶矩阵(r*c)
vector<vector<int>>result(r,vector<int>(c,0));
for(int i =0;i<m*n;i++){
//i = 0,1,2,3 此时意思即是把原来的二维数组展开成一个一维数组
//然后再按照法则重新映射回一个新的二维数组
//i/n 就是行序号 i%n 则代表列序号 这个小技巧要牢记
result[i/c][i%c] = mat[i/n][i%n];
}
return result;
}
};
i/n
就是行序号 ,i%n
则代表列序号 这个小技巧要牢记,以后还有需要一维数组索引映射成二维数组的时候,索引之间的对应关系就可以用这个