我们可以按照递归的思路来进行,每次打印矩阵的外圈,然后剩下的内部的小矩阵重复这个过程。

    ArrayList<Integer> res = new ArrayList<>();
    int[][] Matrix;
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        Matrix = matrix;
        int row = matrix.length;
        if(row == 0)
            return res;
        int col = matrix[0].length;
        helper(0,0,row-1,col-1);
        return res;
    }
    private void helper(int i1,int j1,int i2,int j2)
    {
        if(i2 < i1 || j2 < j1)
            return;
        for(int i = j1;i <= j2;i++)
            res.add(Matrix[i1][i]);
        for(int i = i1+1;i <= i2-1;i++)
            res.add(Matrix[i][j2]);
        if(i2 != i1)
            for(int i = j2;i >= j1;i--)
                res.add(Matrix[i2][i]);
        for(int i = i2-1;i >= i1+1;i--)
            res.add(Matrix[i][j1]);
        helper(i1+1,j1+1,i2-1,j2-1);
    }