力扣数组基础之模拟螺旋矩阵Ⅱ

题目:给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

示例

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

思路

  • 生成一个 n×n 空矩阵 mat,随后模拟整个向内环绕的填入过程:

    • 定义当前左右上下边界 l,r,t,b,初始值 num = 1,迭代终止值 tar = n * n;
    • 当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:
      • 执行 num += 1:得到下一个需要填入的数字;
      • 更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1。
  • 使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。

代码

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
38
39
// 螺旋矩阵 II
func generateMatrix(n int) [][]int {
// 新建矩阵
var ret = make([][]int, n)
for i := 0; i < len(ret); i++ {
ret[i] = make([]int, n)
}
// 定义左右上下边界
var left, right, top, bottom int = 0, n - 1, 0, n - 1
var begin int = 1
for begin < n*n {
// 从左到右
for i := 0; i < right; i++ {
ret[top][i] = begin
begin++
}
top++
// 从上到下
for i := top; i < bottom; i++ {
ret[i][right] = begin
begin++
}
// 从右到左
right--
for i := right; i >= 1; i-- {
ret[bottom][i] = begin
begin++
}
// 从下到上
bottom--
for i := bottom; i >= 1; i-- {
ret[i][left] = begin
begin++
}
left++
}

return ret
}