1. 程式人生 > >Leetcode演算法——59、螺旋矩陣II(square matrix II)

Leetcode演算法——59、螺旋矩陣II(square matrix II)

給定一個正整數 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))