友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
|
|
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

公众号的微信号是: jikerizhi。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
885. 螺旋矩阵 III
在 rows x cols 的网格上,你从单元格 (rStart, cStart) 面朝东面开始。网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列。
你需要以顺时针按螺旋状行走,访问此网格中的每个位置。每当移动到网格的边界之外时,需要继续在网格之外行走(但稍后可能会返回到网格边界)。
最终,我们到过网格的所有 rows x cols 个空间。
按照访问顺序返回表示网格位置的坐标列表。
示例 1:
输入:rows = 1, cols = 4, rStart = 0, cStart = 0 输出:[[0,0],[0,1],[0,2],[0,3]]
示例 2:
输入:rows = 5, cols = 6, rStart = 1, cStart = 4 输出:[[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]
提示:
-
1 <= rows, cols <= 100 -
0 <= rStart < rows -
0 <= cStart < cols
思路分析
在每个方向的行走长度,我们发现如下模式:1,1,2,2,3,3,4,4,… 即我们先向东走 1 单位,然后向南走 1 单位,再向西走 2 单位,再向北走 2 单位,再向东走 3 单位,等等。
按照我们访问的顺序执行遍历并记录网格的位置。
-
一刷
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
/**
* @author D瓜哥 · https://www.diguage.com
* @since 2026-08-25 21:44:37
*/
public int[][] spiralMatrixIII(int rows, int cols, int r, int c) {
List<int[]> result = new ArrayList<>();
int[][] directions = new int[][]{
{0, 1}, // 0右
{1, 0}, // 1左
{0, -1}, // 2下
{-1, 0} // 3上
};
result.add(new int[]{r, c});
if (rows * cols == result.size()) {
return result.toArray(new int[result.size()][]);
}
for (int k = 1; k < 2 * (rows + cols); k += 2) {
for (int i = 0; i < 4; i++) {
int dk = k + (i / 2);
for (int j = 0; j < dk; j++) {
r += directions[i][0];
c += directions[i][1];
if (0 <= r && r < rows && 0 <= c && c < cols) {
result.add(new int[]{r, c});
if (rows * cols == result.size()) {
return result.toArray(new int[result.size()][]);
}
}
}
}
}
return null;
}

