【leetcode数组和字符串】螺旋矩阵

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

均为转载摘录

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
                vector<int> res;
        int nr = matrix.size();
        if(nr == 0) { return res; }
        int nc = matrix[0].size();
        if(nc == 0) { return res; }

        /* 方向向量 */
        vector<vector<int>> dirs{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        /* 行/列分别可以移动多少步,初始时行可以移动列数步,列可以移动行数-1步 */
        vector<int> steps{nc, nr - 1};
        /* [ir, ic]记录当前的位置,初始为[0, -1] */
        int ir = 0;
        int ic = -1;
        /* idir记录当前的方向,可以是0,1,2,3 */
        int idir = 0;
        /* 如果当前方向上仍然可以移动,就继续移动 */
        while(steps[idir % 2])
        {
            /* idir % 2表示是水平还是垂直方向,steps[idir % 2]表示当前方向还可以移动多少步 */
            for(int i = 0; i < steps[idir % 2]; ++i)
            {
                /* dirs[idir]表示当前方向 */
                ir += dirs[idir][0];
                ic += dirs[idir][1];
                res.emplace_back(matrix[ir][ic]);
            }
            /* 每移动一个方向,对应剩余步数减一 */
            --steps[idir % 2];
            /* 改变方向 */
            idir = (idir + 1) % 4;
        }
        return res;
    }
};

螺旋矩阵-变式

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n));
        if(n == 0)
            return res;

        vector<vector<int>> dirs{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        vector<int> steps{n, n - 1};
        int ir = 0;
        int ic = -1;
        int dir = 0;
        int num = 1;
        while(steps[dir % 2])
        {
            for(int i = 0; i < steps[dir % 2]; ++i)
            {
                ir += dirs[dir][0];
                ic += dirs[dir][1];
                /* 这里改为赋值 */
                res[ir][ic] = num++;
            }
            --steps[dir % 2];
            dir = (dir + 1) % 4;
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43046082/article/details/84722586