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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HappyRocking/article/details/85001620

给定一个正整数 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))

猜你喜欢

转载自blog.csdn.net/HappyRocking/article/details/85001620