//只需要两个变量循环打印就是了,打印一圈过后就需要调整打印的边界和起始点
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> res=new ArrayList<>();
int n,m;
n=matrix.length;
m=matrix[0].length;
//x,y表示打印起始位置
int x=0;
int y=0;
//count表示循环的圈数
int count=0;
//sum和all是用来结束循环的,我没有计算打印的圈数,而是统计打印的个数,肯定时间复杂度要高一点
int sum=0;
int all=n*m;
while(1==1){
//表示当前打印的圈数
x=count;
y=count;
//打印横着的第一行
for(;y<m;y++){
res.add(matrix[x][y]);
sum++;
}
if(sum>=all)
break;
//打印竖立的最后一行,y-=1是因为前面for循环多加了一个1.
x+=1;y-=1;
for(;x<n;x++){
res.add(matrix[x][y]);
sum++;
}
if(sum>=all)
break;
y-=1;x-=1;
for(;y>=count;y--){
res.add(matrix[x][y]);
sum++;
}
if(sum>=all)
break;
x-=1;y+=1;
//这里打印的圈数加一
count++;
for (;x>=count;x--){
res.add(matrix[x][y]);
sum++;
}
if(sum>=all)
break;
//调整下一圈打印的边界
m--;n--;
}
return res;
}
}