给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。

螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。

示例 1:

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

示例 2:

**输入:**array = [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]
输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

限制:

0 <= array.length <= 100

0 <= array[i].length <= 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
31
32
33
34
35
class Solution {
public:
vector<int> ans;
vector<pair<int, int>> dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
vector<int> spiralArray(vector<vector<int>> &array) {
if (array.empty() || array[0].empty()) {
return {};
}
int up = 0, left = 0;
int down = array.size() - 1;
int right = array[0].size() - 1;
int flag = 0;
int i = 0, j = 0;
while (up <= down && left <= right) {
ans.push_back(array[i][j]);

if (flag == 0 && j == right) {
flag = 1;
up++;
} else if (flag == 1 && i == down) {
flag = 2;
right--;
} else if (flag == 2 && j == left) {
flag = 3;
down--;
} else if (flag == 3 && i == up) {
flag = 0;
left++;
}
i += dir[flag].first;
j += dir[flag].second;
}
return ans;
}
};