54. 螺旋矩阵

题目

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

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

代码

定义方向数组,先右,再下,再左,再上,与bfs写法类似. 撞墙了或者走过了,就该换方向了。

class Solution2 {
private:
    const int dx[4] = {0, 1, 0, -1};
    const int dy[4] = {1, 0, -1, 0};
    vector<int> res;
    const int USED = 1e9+10;
    int n, m; // n rows, m columns
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        n = matrix.size(); m = matrix[0].size();
        res.assign(m*n, 0);
        int d = 0; int x = 0, y = 0;
        for (int i = 0; i < m*n; i++) {
            res[i] = matrix[x][y];
            matrix[x][y] = USED;
            int a = x+dx[d]; int b = y + dy[d];
            if (a < 0 || a >= n || b < 0 || b >= m) // 超边界
            {d = (d+1) % 4;}
            else if (matrix[a][b] == USED) // 这里要加else,否则上面超界了还会访问matrix[a][b]
            {d = (d+1) % 4;}
            x = x + dx[d];
            y = y + dy[d];
        }
        return res;
    }
};
posted @ 2026-03-27 14:38  saulstavo  阅读(8)  评论(0)    收藏  举报