import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param matrix int整型二维数组
     * @return int整型ArrayList
     */
    public ArrayList<Integer> spiralOrder (int[][] matrix) {
        // write code here
        if (matrix == null || matrix.length == 0) {
            return new ArrayList<>();
        }

        int left = 0;
        int right = matrix[0].length - 1;
        int up = 0;
        int down = matrix.length - 1;
        bl( matrix,  left,  right,  up,  down);

        return list;
    }

    ArrayList<Integer> list = new ArrayList<>();
    private void bl(int[][] matrix, int left, int right, int up, int down) {

        if (left > right || up > down) {
            return;
        }

        // 单独处理一行
        if (up == down) {
            for (int i = left; i <= right; i++) {
                list.add(matrix[up][i]);
            }
            return;
        }

        // 单独处理一列
        if (left == right) {
            for (int i = up; i <= down; i++) {
                list.add(matrix[i][left]);
            }
            return;
        }

        // 从左到右边
        for (int i = left; i <= right; i++) {
            list.add(matrix[up][i]);
        }

        // 从上到下边
        for (int i = up + 1; i <= down; i++) {
            list.add(matrix[i][right]);
        }

        // 从右下到左下边
        for (int i = right - 1; i >= left; i--) {
            list.add(matrix[down][i]);
        }

        // 从左下到左上边
        for (int i = down - 1; i > up; i--) {
            list.add(matrix[i][left]);
        }

        bl(matrix,  left + 1,  right - 1,  up + 1,  down - 1);
    }
}