ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NO54. 螺旋矩阵

2022-07-27 15:32:52  阅读:113  来源: 互联网

标签:遍历 matrix 螺旋 res 矩阵 移动 List NO54 cur


整体思路
   

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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有