import java.util.ArrayList;
public class Solution {
   public ArrayList<Integer> spiralOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0) {
            return new ArrayList<>();
        }

        ArrayList<Integer> list = new ArrayList<>();

        int m0 = 0;
        int m1 = matrix.length - 1;
        int n0 = 0;
        int n1 = matrix[0].length - 1;

        while (m0 <= m1 && n0 <= n1) {
            scan(list, matrix, m0, m1, n0, n1);
            m0++;
            n0++;
            m1--;
            n1--;
        }

        return list;
    }

    private void scan(ArrayList<Integer> list, int[][] matrix, int m0, int m1, int n0, int n1) {
        if (m0 > m1 || n0 > n1) {
            return;
        }

        //当二维数组的最内层只剩下一行或者一列时,最内层遍历的不再是上、右、下、左4条边


        //m0行,从n0 到 n1遍历完整
        for (int i = n0; i <= n1; i++) {
            list.add(matrix[m0][i]);
        }

        //如果最内层只有一行,那么只执行第一个for循环
        if (m0 == m1) {
            return;
        }

        //n1列,从m0+1 行到m1行 遍历完整
        //如果m0+1 大于m1,则for 不会执行
        for (int i = m0 + 1; i <= m1; i++) {
            list.add(matrix[i][n1]);
        }

        //如果内层只有一列,那么只执行前两个for循环
        if (n0 == n1) {
            return;
        }

        //m1行,从n1-1倒序遍历至n0
        //若n1-1本身就小于n0,则for 不会执行
        for (int i = n1 - 1; i >= n0; i--) {
            list.add(matrix[m1][i]);
        }

        //n0列,从m1-1倒序遍历至m0+1
        //
        for (int i = m1 - 1; i >= m0 + 1; i--) {
            list.add(matrix[i][n0]);
        }

    }
}