//只需要两个变量循环打印就是了,打印一圈过后就需要调整打印的边界和起始点
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;
    }
}