0%

885. Spiral Matrix III

O(max(R, C)2) time O(1) space
思路就是按照旋转方向走一遍即可,出界也照走,只有在界内才放到res里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
vector<vector<int>> spiralMatrixIII(int R, int C, int r0, int c0) {
vector<vector<int>> res = {{r0, c0}};
int dr[] = {0, 1, 0, -1}, dc[] = {1, 0, -1, 0};
int sz = 1, dir = 0, r = r0, c = c0;
while (res.size() < R * C) {
for (int i = 0; i < sz; ++i) {
r += dr[dir];
c += dc[dir];
if (0 <= r && r < R && 0 <= c && c < C) {
res.push_back({r, c});
}
}
dir = (dir + 1) % 4; // 方向每次转一下
sz += !(dir & 1); // 在每个方向上走的步数,每两个方向加一,即dir模2为0时加一
}
return res;
}
};