题目
输入一个矩阵,要求按照从外向里顺时针依次打印出每一个数字。
示例:
输入:
matrix =[[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
本题与LeetCode 54题相同:https://leetcode-cn.com/problems/spiral-matrix/
算法思路
按照题目要求,打印顺序依次为 从左到右 -> 从上达到下 -> 再从右往左 -> 再从下往上直到所有数据都访问了。
步骤:
- 首先需要定义几个变量并初始化,矩阵的上下左右边界–>t、d、l、r;
- 然后再依次循环打印矩阵,从左向右,从上往下,从右往左,从下往上,每个方向都要注意边界,本行或本列打印完后边界需要向内收缩,每次收敛的都不同。如从左到右打印完了一行,说明该行已经打印,所以对于top就需要自增1;再从上往下打印了一列,说明该列打印了,列数right自减1;再从右往左打印了以行,说明改行已打印,行数down自减1;再然后从下往上打印一列,边界是不超过top,行数left自增1。
代码
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
return new int[0];
int m = matrix.length,n = matrix[0].length;
int l = 0,r = n-1,t = 0,d = m-1,index = 0; //初始化几个变量左,右,上,下
int[] res = new int[m*n];
while(l <= r && t <= d){ //循环结束条件
for(int i = l; i <= r; i++){ //从左至右,从l开始,直到r
res[index++] = matrix[t][i];
}
t++; //更新top,向下移动一行
for(int i = t;i <= d;i++){ //从上至下,从t开始,直到d
res[index++] = matrix[i][r];
}
r--;//更新right,向左移动一行
for(int i = r;i >= l && t <= d;i--){//从右向左,r --> l
res[index++] = matrix[d][i];
}
d--;//更新down,向上移动一行
for(int i = d;i >= t && l <= r;i--){ //从下往上, d --> t
res[index++] = matrix[i][l];
}
l++;//更新left,向右移动一行
}
return res;
}
}
本题最需要注意的就是几个边界的处理,每次循环的开始和结束。
复杂度
时间复杂度:O(MN),M是矩阵的行数,N是矩阵的列数
空间复杂度 :O(1)
本文详细解析了如何按螺旋顺序打印矩阵元素的算法,通过定义边界变量,实现从外向内的顺时针打印,适用于0<=matrix长度<=100的矩阵。
1万+

被折叠的 条评论
为什么被折叠?



