目录
一、题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
二、思路
1、定义方向,【右、下、左、上】;
2、规定边界;
- 1右: (t,l),向右遍历,x轴 方向++,y轴 方向不变,随后t++,若t>b,遍历结束,退出循环;
- 2下:(t,r)向下遍历,x轴 方向不变,y轴 方向++,随后r--;若l>r,遍历结束,退出循环;
- 3左:(b,r)向左遍历,x轴方向--,y轴方向不变,随后b--; 若t>b,遍历结束,退出循环;
- 4上:(b,l),向上遍历,x轴 方向不变,y轴 方向--,随后l++,若l>r,遍历结束,退出循环;
遍历完一个方向,边界就收缩一次,若未遍历完,就继续遍历另外一个方向。
三、代码
class Solution {
public int[] spiralOrder(int[][] matrix) {
// 特殊情况 为空或者没有元素
if(matrix==null||matrix.length ==0||matrix[0].length==0){
return new int[0];
}
// 定义四个边界
int l=0,t=0,r=matrix[0].length-1,b= matrix.length-1;
int[] res = new int[(r+1)*(b+1)];
int k=0;
while (true){
//1、 一开始从左向右遍历(t,l)
for (int i = t,j=l; j <=r ; j++) {
res[k++]= matrix[i][j];
}
// 判断是否遍历完
if(++t>b) break;
//2、 从上往下遍历(t,r)
for (int i = t,j=r; i <=b ; i++) {
res[k++] = matrix[i][j];
}
// 判断是否遍历完
if(l>--r) break;
// 3、从右往左遍历(b,r)
for (int i = b, j=r; j>=l ; j--) {
res[k++]=matrix[i][j];
}
// 判断是否遍历完
if(t>--b)break;
// 4、从下往上遍历(b,l)
for (int i =b , j=l; i >=t ; i--) {
res[k++]=matrix[i][j];
}
// 判断是否遍历完
if(++l>r) break;
}
return res;
}
}