螺旋矩阵 II

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

示例:

输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        list0 = [j for j in range(1,n**2 + 1)]                          # 生成长列表
        x = y = 0
        dx = [0,1,0,-1]                                                 # 方向坐标
        dy = [1,0,-1,0]
        di = 0
        visited = set()                                                 # 初始化集合,用于记录已走过坐标
        list1 = [[None for k in range(n)] for k in range(n)]            # 生成空矩阵
        for i in range(n**2):
            list1[x][y] = list0[i]                                      
            visited.add((x,y))
            nx,ny = x + dx[di],y+dy[di]                                 # 记录下一步操作
            if 0<=nx<n and 0<=ny<n and (nx,ny) not in visited:          # 判断是否越界,未曾走过的路
                x,y = nx,ny
            else:
                di = (di+1)%4
                x,y= x+dx[di],y+dy[di]
        return list1

#测试示例
data = 3
x = Solution()
prt = x.generateMatrix(data)
print(prt)

#输出结果
[[1, 2, 3], [8, 9, 4], [7, 6, 5]]

解析:list0初始化为:[1,2,3,4,5,6,7,8,9] ,dx,dy用来控制方向,list1是最终的结果列表,list1初始化为:[[None,None,None],[None,None,None],[None,None,None]],而后通过for循环分别将list1的元素赋值:list[0][0] = 1   list[0][1] = 2    list[0][2] = 3   转向,list[1][2] = 4    list[2][2] = 5    转向,list[2][1] = 6    list[2][0] = 7    转向,list[1][0] = 8   转向,list[1][1] = 9  , 本题的关键在于构造dx,dy转向表 和 对边界的判断,此方法思路清晰,代码简洁,值得小伙伴们学习。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值