剑指offer29——顺时针打印矩阵(力扣54:螺旋矩阵):思路分享
思路解析:
找到左上角和右下角,就能够将一圈的数字打印出来!打印完一圈后,只需要左上角的坐标+1,右下角的坐标-1,循环即可
循环判断条件就是左上角的坐标<=右上角的坐标
步骤分析:
- 判断二维数组是否为空,为空则返回空数组
- 找到左上角和右下角的坐标,设为
(tR,tC),(dR,dC)
- 创建结果数组
- 创建数组索引,便于向数组中传值
- 进入循环,确定循环终止条件:是左上角和右上角重合
- 进入循环首先判断是否为同一条直线
- 如果不是一条直线,按顺序打印”上、右、下、左“四条边
- 每次循环结束,都要改变起始坐标
注意!
- 每列(行)的转折点交给下一行(列)处理,不然会出现数组越界
- 如果是用数组接收打印结果的话,要注意数组的索引,也就是全局变量
count
,此时不能将打印代码封装到while循环中,count
的值会覆盖 - !!每次大循环结束,再改变坐标:因为当出现所有数在一行或一列的情况时,结果一次就打印完了。如果最后没改变坐标,将会进入死循环,只有改变坐标后,才能触发循环终止条件,及左上角坐标大于右下角,才能返回值。
复杂度分析:
- 时间复杂度为
O(mn)
,因为将每个元素都访问了一遍 - 空间复杂度为
O(1)
,因为不需要额外空间,数组res是题目中规定的
Java代码如下:
class Solution {
public int[] spiralOrder(int[][] matrix) {
//如果二维数组为空,返回空数组即可
if(matrix.length==