题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例
[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]
则依次打印出数字
[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
限制
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
思路
使用一个偏移量来控制行走方向,用一个布尔类型的数组存储某位置是否已经走过。当要越界或已经走过那个位置时,通过偏移量来改变行走方向
代码
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (!matrix.size()) return {};
vector<int> res;
int m = matrix.size(), n = matrix[0].size();
vector<vector<bool>> st(m, vector<bool>(n));
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
for (int i = 0, x = 0, y = 0, d = 0; i < m * n; i ++ ) {
res.push_back(matrix[x][y]);
st[x][y] = true;
int a = x + dx[d], b = y + dy[d];
if (a < 0 || a >= m || b < 0 || b >= n || st[a][b]) {
d = (d + 1) % 4;
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
return res;
}
};