Leetcode 54:Spiral Matrix 螺旋矩阵
54:Spiral Matrix 螺旋矩阵
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
Example 1:
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] Output: [1,2,3,4,8,12,11,10,9,5,6,7]
解题思路:
参考例二,观察索引改变方式:(0,0)--->(0,3)、(0,3)--->((2,3)--->(2,0)--->(1,0)--->(1,2)
从(0,3)看,分别是:向下 横坐标自增1,到2;向左:纵坐标自减1 ,到0;向上横坐标自减1,到1;向右纵坐标自增1,到2
假如m*n的矩阵,从(0,m-1)开始,向下移动n-1次到达最下面,再向左m-1次,向上n-2次,向右m-2次,接着就是:向下n-3,向左m-3,向上n-4,向右m-4。每次转向m或n都会自减1。
这是我的思路,网上很多都是直接操作索引坐标,我觉得不是很好理解,因为超过一个螺旋的矩阵,每次都要更改参考坐标,不过两种方法本质差别不大
java:
class Solution { public List<Integer> spiralOrder(int[][] matrix) { List nums=new ArrayList(); if (matrix.length==0||matrix[0].length==0)return nums ; int row=matrix.length-1,col=matrix[0].length-1,m=0,n=0,i=-1,tmp=0; while (row>=0&&col>=0){ switch (i++%4){ case 0: for (tmp=0;tmp<row;tmp++) nums.add(matrix[++m][n]);row-=1; break; case 1: for (tmp=0;tmp<col;tmp++) nums.add(matrix[m][--n]);col-=1; break; case 2: for (tmp=0;tmp<row;tmp++) nums.add(matrix[--m][n]);row-=1; break; case 3: for (tmp=0;tmp<col;tmp++) nums.add(matrix[m][++n]);col-=1; break; default: for (tmp=0;tmp<=col;tmp++) nums.add(matrix[m][n++]);tmp=0;n-=1; break; } } return nums; } }
注意点:
先判断是否为空数组,判断条件顺序不能颠倒。因为如果 matrix.length==0
判断为true,则后面的 matrix[0].length==0
不会再判断,即返回空数组;但是matrix[0].length==0
在前时,如果输入数组为空,matrix[0]
会报错因为matrix并没有0号索引。
python3:
class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: if len(matrix)==0 or len(matrix[0])==0:return [] nums=[];m=0;n=0;row=len(matrix)-1;col=len(matrix[0])-1;flag=0; for n in range(col+1):nums.append(matrix[m][n]) while row>=0 and col>=0: if flag % 4 == 0: for i in range(row): m+=1 nums.append(matrix[m][n]) row -= 1 elif flag % 4==1: for i in range(col): n-=1 nums.append(matrix[m][n]) col -= 1 elif flag % 4 == 2: for i in range(row): m-=1 nums.append(matrix[m][n]) row -= 1 elif flag % 4 == 3: for i in range(col): n+=1 nums.append(matrix[m][n]) col -= 1 flag+=1 return nums
注意点:
python没有switch...case...语句。for循环可操作性很高,可以直接操作索引坐标改变遍历方式,不再赘述。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Leetcode 118:Pascal's Triangle 杨辉三角
118:Pascal's Triangle 杨辉三角 Given a non-negative integer numRows, generate the first numRows of Pascal's triangle. 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。 In Pascal's triangle, each number is the sum of the two numbers directly above it. 在杨辉三角中,每个数是它左上方和右上方的数的和。 Example: Input: 5 Output: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 解题思路: 第一行第二行都是1,每行第一个和最后一个都为1,假设其他位置的数x索引坐标是(m,n),则x就是数是它 索引正上方的数和索引正上方的左边的数 之和。即(m-1,n),(m-1,n-1)两数和。 java: class Solution { public List<List<Integer>> ...
- 下一篇
突破Java面试(9)-如何保证消息队列的顺序性
0 Github 1 面试题 如何保证消息的顺序性? 2 考点分析 MQ必问话题 考察你是否了解顺序性 考察你是否有办法保证消息的顺序性,因为这是生产系统中常见的一个问题. 3 详解 3.0 案例 一个MySQL binlog同步系统,日同步数据达到上亿. 在MySQL里增删改一条数据 即对应出增删改3条binlog 接着这三条binlog发送到MQ里面 消费出来依次执行 应该得保证消息按照顺序执行的吧!不然本来是:增加->修改->删除你楞是换了顺序给执行成:删除->修改->增加全错!!! 该数据同步过来,最后本该被删除,结果你搞错顺序,最后它却被保留下来了,数据同步出错! 3.1 顺序错乱的场景 3.1.1 rabbitmq 一个queue,多个consumer,这不明显乱了 3.1.2 kafka 一个topic,一个partition,一
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8