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

示例 1:

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

示例 2:

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

提示:

m == matrix.length

n == matrix[i].length

1 <= m, n <= 10

-100 <= matrix[i][j] <= 100

维护四个边界,每次到达边界则转换方向再收缩即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>> &matrix) {
vector<pair<int, int>> dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int flag = 0, top = 0, left = 0;
int down = matrix.size() - 1;
int right = matrix[0].size() - 1;
vector<int> ans;
int i = 0, j = -1;
while (top <= down && left <= right) {
i += dir[flag].first;
j += dir[flag].second;
ans.push_back(matrix[i][j]);
if (j == right && flag == 0) {
top++;
flag = 1;
} else if (i == down && flag == 1) {
right--;
flag = 2;
} else if (j == left && flag == 2) {
down--;
flag = 3;
} else if (i == top && flag == 3) {
left++;
flag = 0;
}
}
return ans;
}
};