给定一个正整数 n,要求生成一个方阵,里面的元素为1到n^2按照螺旋顺序排列。
示例:
Input: 3
Output:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路
可以参考 Leetcode算法——54、螺旋矩阵(spiral matrix),不同之处在于,54 题是给定一个矩阵,求螺旋顺序的序列;本题是给定一个序列,要求按螺旋顺序生成一个矩阵。
递归法:
1、初始化一个n*n矩阵
2、先按照顺时针顺序,对最外圈进行赋值。
最外圈的顺时针顺序为:
1、最上面一行,从左到右
2、最右面一列,从上到下
3、最下面一行,从右到左
4、最左面一列,从下到上
3、然后,使用递归法,处理第二圈、第三圈等,直到矩阵最中间的一圈也被赋值完毕(这也是递归结束条件)。
python实现
def generateMatrix(n):
"""
:type n: int
:rtype: List[List[int]]
递归法。
"""
board = [[0 for i in range(n)] for i in range(n)]
def generate(k, nextvalue):
'''
生成第k个外圈以及内部所有元素。
'''
nonlocal board
# 计算最外圈的两行两列位置
minr = k-1 # 上行、左列
maxr = n-k # 下行、右列
# 递归结束条件
if minr > maxr:
return
if minr == maxr:
board[minr][minr] = nextvalue
return
# 开始生成最外圈
for i in range(4): # 逆时针旋转4次
# 最上面一行赋值
board[minr][minr:maxr] = list(range(nextvalue, nextvalue + maxr - minr))
nextvalue = board[minr][maxr-1] + 1
board = [list(x) for x in zip(*board)][::-1] # 逆时针旋转
# 递归生成里面的圈
generate(k+1, nextvalue)
generate(1, 1)
return board
if '__main__' == __name__:
n = 3
print(generateMatrix(n))