54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]

思路:

这道题意思理解起来非常容易,但解决是需要一点规律的。我有两种方法来解决,都还是挺依赖套路和规律的。

第一种方法:

每次拿掉第一行元素,然后将矩阵逆时针旋转。重复这个操作,我们就像剥水果一样,矩阵就被我们剥完了~是不是非常好理解!然后将矩阵逆时针旋转的方法我原来在这篇也总结过,其实逆时针旋转就是一句话:matrix = list(zip(*matrix))[::-1]

好了,直接看代码吧:

法1代码:

class Solution(object):def spiralOrder(self, matrix):res = []while matrix:# 削头(第一层)res += matrix.pop(0)# 将剩下的逆时针转九十度,等待下次被削matrix = list(zip(*matrix))[::-1]return res

第二种方法:

第一种方法感觉技巧性实在是太强,第二种做法就显得正常很多了。我们使用(i,j)点来进行遍历游走,初始化自然是(0,0)点,因为我们的点在碰到边界处时需要改变方向,但方向又不定,所以关键在于我们如何控制游走的方式

方法就是:我们使用di,dj来控制游走,每次移动时,(i,j)就变成(i+di,j+dj)。因为一开始是向右移动,所以显然一开始di,dj初始化为0,1。为了记录我们遍历过得地方,我们将走过的地方置为0。那么如何判断转向呢?我们使用matrix[(i+di)%m][(j+dj)%n]来进行下一步的试探,如果下一步会超过边界,就会回到这一行或这一列的起点处,也就是0。那如何控制转向呢?有个非常妙绝的式子就可以搞定:di,dj = dj,-di。

如图,不断地重复找个操作,就可以自动实现碰到边界后顺时针游走的功能。(先向右,再向下,再向左,再向上,又向右……)

法2代码:

class Solution(object):def spiralOrder(self, matrix):if not matrix:return []#处理特殊情况res=[]#存放结果i,j,di,dj=0,0,0,1 #初始化i,j,di,djm = len(matrix)#拿到矩阵的长m和宽nn = len(matrix[0])for _ in range(m*n):#遍历矩阵的总元素个数a=matrix[i][j]#取出当前值res.append(a)matrix[i][j]=0#遍历到的,就置0if matrix[(i+di)%m][(j+dj)%n]==0:#判断是否转向di,dj = dj,-di#一句话搞定转向#进行移动i+=dij+=djreturn res

小结:

这道题提了两种方法,第一种其实是最好记忆和理解的,但有点投机取巧;第二种算是中规中矩,不过控制移动的思路还是用了一些套路或者是技巧,一半理解一半记忆就好了。

LeetCode螺旋矩阵相关推荐

  1. leetcode螺旋矩阵总结

    螺旋矩阵题目: leetcode54,59,885,2326 leetcode54 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4, ...

  2. LeetCode 螺旋矩阵(Spiral Matrix)

    思路:做四个方向的遍历右,下,左,上.重复循环这四个方向即得到螺旋矩阵. 注意问题: 1.边界 2.判断当前位置是否已经遍历(mark标志位) 3.vector为空或者只有一个元素 4.循环退出条件 ...

  3. LeetCode实战:螺旋矩阵 II

    题目英文 Given a positive integer n, generate a square matrix filled with elements from 1 to n^2 in spir ...

  4. LeetCode 59 Spiral Matrix II(螺旋矩阵II)(Array)

    版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/5214 ...

  5. LeetCode Spiral Matrix II (生成螺旋矩阵)

     Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. F ...

  6. 跟我打卡LeetCode 58最后一个单词长度59螺旋矩阵Ⅱ60排列序列

    原创公众号:bigsai 关注后回复进群即可加入力扣打卡群,欢迎划水.近期打卡: LeetCode 47全排列Ⅱ&48旋转图像 LeetCode 49字母异位词分组&50pow(x,n ...

  7. LeetCode打卡 52八皇后Ⅱ53最大子序和54螺旋矩阵

    原创公众号:bigsai 希望和优秀的你做朋友,感觉不错还请一键三连. 回复进群即可加入和200+人一起打卡.上周打卡: LeetCode 47全排列Ⅱ&48旋转图像 LeetCode 49字 ...

  8. LeetCode 885. 螺旋矩阵 III

    1. 题目 在 R 行 C 列的矩阵上,我们从 (r0, c0) 面朝东面开始 这里,网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列. 现在,我们以顺时针按螺旋状行走,访问此网格中的每 ...

  9. LeetCode 59. 螺旋矩阵 II LeetCode 54. 螺旋矩阵

    文章目录 1. 题目信息 2. LeetCode 59 解题 3. LeetCode 54. 螺旋矩阵 4.<剑指Offer>面试题29 1. 题目信息 给定一个正整数 n,生成一个包含 ...

最新文章

  1. 美观实用!Star 过万,用 Python 做交互式图形的这款工具火了!
  2. Jquery真的很棒
  3. BCB中获得RichEdit 默认行间距
  4. 32位程序调用64位dll_电脑系统怎样区分32位和64位
  5. 用 Go 构建一个区块链 -- Part 5: 地址 1
  6. POJ1275-Cashier Employment【差分约束系统】
  7. Android pda出入库管理,出入库PDA管理系统软件
  8. linux内核压缩制作bzImage
  9. FLEX:target和currentTarget属性的区别
  10. python simdjson_python+json
  11. 嵌入式通过绑定实现双网卡冗余
  12. python ui自动_pytest+python下的UI自动化基础框架
  13. netty mysql 中间件_阿里开源Mysql分布式中间件:Cobar
  14. Atitit java onvif 开源类库 getProfiles getStreamUri
  15. 将c编译成.so 并调用(ubuntu)
  16. TMS570-3-RTI中断
  17. 向量的数量积和向量积
  18. webgl的平行光漫反射示例
  19. Kanzi入门学习(二)
  20. Java项目:学生综合素质评价系统(java+SSM+thymeleaf+layui+Mysql)

热门文章

  1. 借助ssh往虚拟机传文件
  2. 8259的IRR、ISR、IMR的功能
  3. mysql 数据库还原_MySQL数据库备份和还原的常用命令
  4. VS2013中直接浏览网页显示“无法显示此页”的可能原因
  5. MAC协议之CRC校验码
  6. linux 查看硬盘使用情况
  7. npm ERR! code ELIFECYCLE报错解决
  8. EFCore 之 IQueryable
  9. openwrt指定wan与lan(转载)
  10. Java中Set的遍历