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

76 篇文章 1 订阅

给定一个正整数 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))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值