题解 | #螺旋矩阵#

螺旋矩阵

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循环的次数,于是添加代码在每次遍历前都判断行数和列数在正常范围。

提交,通过。。。就很舒服~

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务