Skip to content

59.螺旋矩阵II

一、问题描述

题目

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针螺旋排列的正方形矩阵。

示例

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

二、方案一:模拟法

1、思路

模拟法是解决这类问题的直接方法。我们按照螺旋的顺序填充矩阵,即先填充上行从左到右,然后填充右列从上到下,接着填充下行从右到左,最后填充左列从下到上,如此循环直至填充完整个矩阵。

2、代码实现

go
func generateMatrix(n int) [][]int {
    matrix := make([][]int, n)
    for i := range matrix {
        matrix[i] = make([]int, n)
    }
    count, startx, starty, offset := 1, 0, 0, 1
    for n > 0 {
        i, j := startx, starty
        // 上行从左到右
        for j < starty + n - offset {
            matrix[startx][j] = count
            count++
            j++
        }
        // 右列从上到下
        for i < startx + n - offset {
            matrix[i][j] = count
            count++
            i++
        }
        // 下行从右到左
        for j > starty {
            matrix[i][j] = count
            count++
            j--
        }
        // 左列从下到上
        for i > startx {
            matrix[i][j] = count
            count++
            i--
        }
        startx++
        starty++
        n -= 2
    }
    return matrix
}

3、复杂度分析

  • 时间复杂度:O(n^2),其中 n 是给定的整数。我们需要填充整个 n x n 的矩阵。
  • 空间复杂度:O(1),我们没有使用额外的空间。

三、总结

模拟法是解决螺旋矩阵问题的有效方法。它通过模拟填充过程,直接生成所需的螺旋矩阵。这种方法在时间和空间复杂度上都是高效的,适合解决这类问题。

木川工作室 (微信:mcmc2024)