在leetcode566重塑矩阵一题中,学到了一种高效遍历二维数组的方法,代码看起来更加简介,易懂。之前见过,但自己撸代码时却没有想起来,看来是不总结学习效果还是差!
具体题目:
给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。
如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
示例 1:
输入:
nums =
[[1,2],
[3,4]]
r = 1, c = 4
输出:
[[1,2,3,4]]
解释:
行遍历nums的结果是 [1,2,3,4]。新的矩阵是 1 * 4 矩阵, 用之前的元素值一行一行填充新矩阵。
class Solution {
public:
vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
int row=nums.size();
if(!row){
return nums;
}
int col=nums[0].size();
if((col*row)!=(r*c)||(col==c&&row==r)){
return nums;
}
vector<vector<int>>result(r,vector<int>(c,0));
int row1=0,col1=0;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(col1>=c){
col1=0;
row1++;
}
result[row1][col1]=nums[i][j];
col1++;
}
}
return result;
}
};
可以发现,我这里遍历二维数组时逻辑繁杂,还容易出错!
下面给出更好的遍历方法
for(int i=0;i<row*col;i++){
result[i/c][i%c]=nums[i/col][i%col];
}
妙不妙???
其实,做过后思考下,突然就明白了为什么说用一维数组初始化二维数组时,行数可以不指定,列数必须指定,这是因为只要知道了列数,我们自然可以方便推断出这个二维数组。