友情支持

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

支付宝

微信

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

wx jikerizhi

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

59. Spiral Matrix II

Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

Example:

Input: 3
Output:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

思路分析

利用 54. Spiral Matrix 的思路,从回溯思想得到启发,使用递归来逐层推进。每次方法调用只负责指定层的遍历,向里推进层次的工作,交给递归来完成。这样避免了复杂的判断。

0054 01
  • 一刷

  • 二刷

 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
36
/**
 * Runtime: 0 ms, faster than 100.00% of Java online submissions for Spiral Matrix II.
 *
 * Memory Usage: 34.3 MB, less than 8.33% of Java online submissions for Spiral Matrix II.
 *
 * @author D瓜哥 · https://www.diguage.com
 * @since 2019-10-26 00:54
 */
public int[][] generateMatrix(int n) {
    int x1 = 0, x2 = n - 1;
    int y1 = 0, y2 = n - 1;
    int i = 1;
    int[][] matrix = new int[n][n];
    while (x1 <= x2 && y1 <= y2) {
        for (int x = x1; x <= x2; x++) {
            matrix[y1][x] = i++;
        }
        for (int y = y1 + 1; y <= y2; y++) {
            matrix[y][x2] = i++;
        }
        if (x1 < x2 && y1 < y2) {
            for (int x = x2 - 1; x > x1; x--) {
                matrix[y2][x] = i++;
            }
            for (int y = y2; y > y1; y--) {
                matrix[y][x1] = i++;
            }
        }
        x1++;
        x2--;
        y1++;
        y2--;
    }

    return matrix;
}
 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
36
37
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2024-09-16 16:02:29
 */
public int[][] generateMatrix(int n) {
  int[][] matrix = new int[n][n];
  backtrack(matrix, 1, 0, 0, n, n);
  return matrix;
}

private void backtrack(int[][] matrix, int start,
                       int row, int column,
                       int rLen, int cLen) {
  int n = matrix.length;
  if (n * n < start) {
    return;
  }
  for (int i = column; i < column + cLen; i++) {
    matrix[row][i] = start++;
  }
  for (int i = row + 1; i < row + rLen; i++) {
    matrix[i][column + cLen - 1] = start++;
  }
  // 不想增加复杂判断了,数量足够就直接返回
  // 如果不返回,在最后只剩下一层且有多个元素时,中间元素会被重复添加
  if (n * n < start) {
    return;
  }
  for (int i = column + cLen - 2; i >= column; i--) {
    matrix[row + rLen - 1][i] = start++;
  }
  for (int i = row + rLen - 2; i > row; i--) {
    matrix[i][column] = start++;
  }
  backtrack(matrix, start, row + 1, column + 1, rLen - 2, cLen - 2);
}