螺旋矩阵II,带有边界的矩阵解法

问题来源:leetcode59题(python写法)

链接:力扣

给一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

具体例子看力扣链接

这里提供一种思路,假设n=3,这里会使用一个边界为5*5的矩阵mat把3*3矩阵围住,然后在边界处设置-1。类似下图:

[-1, -1, -1, -1, -1]
[-1, 0, 0, 0, -1]
[-1, 0, 0, 0, -1]
[-1, 0, 0, 0, -1]
[-1, -1, -1, -1, -1]

初始位置为a=1,b=1,先置mat[a][b]=1,接着由于螺旋矩阵一开始是往右走的,咱们只需要在最开始的while里面优先判断往右即可,即如果mat[a][b+1]==0,就开始赋值,然后这里是b+1,是b且是加号,所以在while里面就要将b一直加1,直到mat[a][b+1]!=0。接着的while顺序怎么写都行,mat[a][b-1]==0,mat[a+1][b]==0,mat[a-1][b]==0,都类似mat[a][b+1]==0的写法。

最后将mat边界内的矩阵取出来即可。

这样可以省去各种判断,什么左闭右开也不用管。

class Solution(object):
    def generateMatrix(self, n):
        """
        :type n: int
        :rtype: List[List[int]]
        """
        # 设置一个(n+2)*(n+2)的矩阵
        mat=[[0 for _ in range(n+2)] for _ in range(n+2)]
        # 将矩阵边界置为-1
        for i in range(n+2):
            mat[0][i]=-1
            mat[-1][i]=-1
            mat[i][0]=-1
            mat[i][-1]=-1
        # num从1计算到n*n
        num=1
        a=1#一维坐标
        b=1#二维坐标
        mat[a][b]=num#先将初始位置赋值上去
        num+=1
        while num<=n*n:
            # 最开始需要向右走
            while mat[a][b+1]==0:
                mat[a][b + 1] = num
                num += 1
                b += 1
            # 接下来三个顺序可以随便写
            while mat[a][b-1]==0:
                mat[a][b - 1] = num
                num += 1
                b -= 1
            while mat[a+1][b]==0:
                mat[a+1][b] = num
                num += 1
                a += 1
            while mat[a-1][b]==0:
                mat[a-1][b] = num
                num += 1
                a -= 1
        # 将矩阵边界内的n*n矩阵取出来
        out = []
        for i in range(1, n + 1):
            out.append(mat[i][1:(n + 1)])
        return out
# solved
if __name__ == "__main__":
    print(Solution().generateMatrix(5))

最后附上一个还不错的速度和内存用量

 说明:如有发现重复思路的纯属巧合,联系删。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值