Leetcode演算法——59、螺旋矩陣II(square matrix II)
阿新 • • 發佈:2018-12-20
給定一個正整數 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))