题目大意:
螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=54
解题思路分析:
想要顺时针螺旋输出矩阵内所有元素,移动顺序应该是从坐标[0, 0]开始按照右下左上的顺序转动,关键在于判断转弯处,我们定义4个变量t,b,l,r来代表上下左右4个边界,初始时4个边界分别为矩阵边界。再定义一个数组dir[],{0,1}代表向右移动,{0,-1}代表向左移动, {1,0} 是向下移动,{-1,0}则是向上移动。初始时,移动方向为右,即{0,1}。
移动到当前点时,先将当前点加入返回结果,然后根据当前方向得出下一点的坐标,当:
- 当前移动方向为右,并且当前右侧点超出右边界r时,方向转为向下。上边t界加一
- 当前移动方向为下,并且当前下侧点超出下边界b时,方向转为向左。右边r界减一
- 当前移动方向为左,并且当前左侧点超出左边界l时,方向转为向上。下边b界减一
- 当前移动方向为上,并且当前上侧点超出上边界t时,方向转为向右。左边l界加一
- 上述以外情况,继续沿当前方向移动
实现代码:
public List<Integer> spiralOrder(int[][] matrix) { // 返回结果 List<Integer> res = new ArrayList<>(); // 如果矩阵为空,返回空 if(matrix.length==0) return res; // 矩阵总元素数 int count=matrix.length*matrix[0].length; // 定义四个边界,初始时为矩阵边界 int l=0,r=matrix[0].length-1,t=0,b=matrix.length-1; // 当前点坐标 int row=0, col=0; // 初始移动方向为向右移动 int[] dir={0,1}; // 当返回结果个数小于元素个数时循环 while(res.size()<count){ // 将当前点加入返回结果 res.add(matrix[row][col]); // 当前移动方向为右,并且当前右侧点超出右边界r时 if(dir[1]==1&&col+1>r){ // 方向转为向下。上边界加一 dir[0]=1; dir[1]=0; t++; } // 当前移动方向为下,并且当前下侧点超出下边界b时 else if(dir[0]==1&&row+1>b){ // 方向转为向左。右边界减一 dir[0]=0; dir[1]=-1; r--; } // 当前移动方向为左,并且当前左侧点超出左边界l时 else if(dir[1]==-1&&col-1<l){ // 方向转为向上。下边界减一 dir[0]=-1; dir[1]=0; b--; } // 当前移动方向为上,并且当前上侧点超出上边界t时 else if(dir[0]==-1&&row-1<t){ // 方向转为向右。左边界加一 dir[0]=0; dir[1]=1; l++; } // 下一个点坐标 row+=dir[0]; col+=dir[1]; } return res; }
本题解法执行时间为0ms。
Runtime: 0 ms, faster than 100.00% of Java online submissions for Spiral Matrix.
Memory Usage: 40.9 MB, less than 5.21% of Java online submissions for Spiral Matrix.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-54-spiral-matrix-解题思路分析/