在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]; }妙不妙???
其实,做过后思考下,突然就明白了为什么说用一维数组初始化二维数组时,行数可以不指定,列数必须指定,这是因为只要知道了列数,我们自然可以方便推断出这个二维数组。