其他分享
首页 > 其他分享> > NO54. 螺旋矩阵

NO54. 螺旋矩阵

作者:互联网

整体思路
   

->对于螺旋矩阵的题目四点:

1.起始位置
2.移动边界
3.边界
4.结束条件
-<介于本题分别是:

1.左上角(0,0)
2.→↓←↑,使用二维数组存储
3.当每行遍历结束后,需要向内部移动从而达到螺旋
4.所有位置被遍历到

 

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix or not matrix[0]:# 特例判断
            return []
        m, n = len(matrix), len(matrix[0]) #设置行数m和列数n
        left,right,up,down = 0,n-1,0,m-1 #上下左右
        res = []
        x,y = 0,0 #现处于的位置
        dirs = [(0,1),(1,0),(0,-1),(-1,0)] #移动方向
        cur_d = 0 #表示当前的移动方向,dirs[cur_d]为下一移动方向
        while len(res) != m*n: #循环条件保证每一个数都被遍历到
            res.append(matrix[x][y]) #添加之后做判断
            if cur_d == 0 and y == right:
                cur_d += 1
                up += 1#到达右边界,准备往下移动
            elif cur_d == 1 and x == down:
                cur_d += 1
                right -= 1 #到达下边界,准备往左移动
            elif cur_d == 2 and y == left:
                cur_d += 1
                down -= 1#到达左边界,准备往上移动
            elif cur_d == 3 and x == up:
                cur_d += 1
                left += 1#到达上边界,准备往右移动
            cur_d %= 4#每4次一轮循环
            x+=dirs[cur_d][0]
            y+=dirs[cur_d][1] #巧妙用移动方向
        return res
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix:return []

        x=y=0                                     # 矩阵元素位置初始化
        res = []                                  # 初始化,存储遍历后的矩阵元素
        dx = [ 0, 1, 0,-1]                        # 方向:右,下,左,上
        dy = [ 1, 0,-1, 0]                        # 注:与通常平面坐标系 记号 不同
        di = 0                                    # 初始化方向变量
        visited = set()                           # 初始化集合,存储已走过的坐标
        m,n = len(matrix),len(matrix[0])          # 矩阵的行列 
                
        for i in range(m*n):                                     # 
            res.append(matrix[x][y])                             # 存储遍历矩阵过的元素
            visited.add((x,y))                                   # 存储遍历过的坐标
            tx,ty = x+dx[di],y+dy[di]                            # 先记录下一步坐标,用于判断下一步怎么走
            if 0<=tx<m and 0<=ty<n and (tx,ty) not in visited:   # 判断坐标是否需变向,且没有遍历过
                x,y = tx,ty                                       
            else:                                                
                di = (di+1)%4                                    # 改变方向,右下左上为一圈,防止方向坐标越界
                x,y = x + dx[di],y+dy[di]                        # 下一步坐标
        return res

 

 

标签:遍历,matrix,螺旋,res,矩阵,移动,List,NO54,cur
来源: https://www.cnblogs.com/blogy-y/p/16525029.html