题解 | #螺旋矩阵#
螺旋矩阵
https://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31
class Solution { public: vector<int> spiralOrder(vector<vector<int> >& matrix) { vector<int> res; int curCol = 0, curRow = 0; int col = matrix.size(); int row = matrix[0].size(); int num = row * col; while ((row > 0) && (col > 0)) { if ((row > 0) && (col > 0)) { for (int i = 0; i < row; i++) { res.push_back(matrix[curCol][curRow++]); } col--; curRow--; curCol++; } if ((row > 0) && (col > 0)) { for (int i = 0; i < col; i++) { res.push_back(matrix[curCol++][curRow]); } row--; curCol--; curRow--; } if ((row > 0) && (col > 0)) { for (int i = 0; i < row; i++) { res.push_back(matrix[curCol][curRow--]); } col--; curRow++; curCol--; } if ((row > 0) && (col > 0)) { for (int i = 0; i < col; i++) { res.push_back(matrix[curCol--][curRow]); } row--; curCol++; curRow++; } } return res; } };
我模拟螺旋矩阵的生成情况来写代码。但是,我还是遇到一些坎:
1.如何模拟螺旋矩阵的遍历方向问题?我想到的是先遍历列——》不变列遍历行——》不变行遍历列——》不变列遍历行。。。依次反复遍历。在while循环内进行遍历。每次遍历行(列)后行数(列数)就减一。
2.但是,在第一次自测运行的时候发现结果只有第一行的数据,后面全是0?幸好牛客有免费的调试工具,我调试一下,才发现在每次遍历后++或--的范围超出了数组的范围。因此我补充在每次遍历后,将++或--的值修正。
3.在遍历一行和一列后,自测发现数据又不对了?经过再次调试发现是重复添加某个值(拐角值),我再次修正拐角值。
4.在提交时,发现数据是一行的时候,会打多一个值?我在调试中发现,我自认为会跳出while循环的时候函数没有跳出循环而是继续进行。于是发现是每次遍历都需要判断行数和列数在正常范围。我想通过for循环修改代码,但是发现不好提取for循环的次数,于是添加代码在每次遍历前都判断行数和列数在正常范围。
提交,通过。。。就很舒服~