友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

885. 螺旋矩阵 III

rows x cols 的网格上,你从单元格 (rStart, cStart) 面朝东面开始。网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列。

你需要以顺时针按螺旋状行走,访问此网格中的每个位置。每当移动到网格的边界之外时,需要继续在网格之外行走(但稍后可能会返回到网格边界)。

最终,我们到过网格的所有 rows x cols 个空间。

按照访问顺序返回表示网格位置的坐标列表。

示例 1:

0885 01
输入:rows = 1, cols = 4, rStart = 0, cStart = 0
输出:[[0,0],[0,1],[0,2],[0,3]]

示例 2:

0885 02
输入: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;
}