问题描述:
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
要生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵,可以使用以下算法:
- 初始化一个 n x n 的矩阵,填充为0或者其他占位符。
- 设置四个变量来表示当前要填充的边界:top, bottom, left, right。
- 从左上角开始,按照顺时针方向,逐层填充数字,每层填充的数字依次递增。
- 每填充完一层,更新边界,缩小填充范围。
- 重复步骤3和4,直到填充完所有的数字。
下面是一个Python函数的实现:
from typing import List
def generateMatrix(n: int) -> List[List[int]]:
matrix = [[0] * n for _ in range(n)]
top, bottom, left, right = 0, n - 1, 0, n - 1
num = 1
while True:
if left > right:
break
for i in range(left, right + 1):
matrix[top][i] = num
num += 1
top += 1
if top > bottom:
break
for i in range(top, bottom + 1):
matrix[i][right] = num
num += 1
right -= 1
if left > right:
break
for i in range(right, left - 1, -1):
matrix[bottom][i] = num
num += 1
bottom -= 1
if top > bottom:
break
for i in range(bottom, top - 1, -1):
matrix[i][left] = num
num += 1
left += 1
return matrix
这个函数会返回一个按照顺时针顺序螺旋排列的 n x n 正方形矩阵。例如,调用generateMatrix(3)会返回:
[[1, 2, 3],
[8, 9, 4],
[7, 6, 5]]
注释:
在Python中,[[0] * n for _ in range(n)]是一个列表推导式,用于创建一个二维列表(也就是矩阵)。这个列表推导式的工作原理如下:
- range(n)生成一个从0到n-1的整数序列。
- 对于这个序列中的每一个整数_(在这里下划线_是一个常见的占位符变量名,表示我们不关心具体的值,只是需要一个循环变量),执行[0] * n。
- [0] * n创建一个包含n个0的一维列表。
- 列表推导式将这些一维列表组合起来,形成一个二维列表(矩阵),其中每一行都是一个长度为n的一维列表。
最终的结果是一个n行n列的二维列表,其中所有的元素都被初始化为0。这个二维列表可以被视为一个n x n的矩阵,用于后续的填充和操作。