//螺旋上下左右过程中,端点是否包括,头尾都要包含,否则当只有一行的情况,就会漏掉元素。 考虑起始点开始螺旋只有一行或者一列的时候,要进行去重。

public ArrayList<Integer> spiralOrder(int[][] matrix) {
        ArrayList<Integer> res = new ArrayList<>();
        //matrix.length==0判断如果是一维矩阵,那么matrix[0]就会报错。
        if(matrix.length==0) return res;
        int col = matrix[0].length-1;
        int row = matrix.length-1;
        //起始点是col/2和row/2的最小值
        for(int i=0;i<=Math.min(col/2,row/2);i++){
            ArrayList<Integer> list = getList(i,matrix,col,row);
            res.addAll(list);
        }
        return res;
    }
    //从某个点开始的螺旋结果
    private ArrayList<Integer> getList(int i, int[][] matrix,int col,int row) {
            //(i,i) (i,col-i)   (row-i,col-i)  (row-i,i)
            ArrayList<Integer> list =new ArrayList<>();
            //对于特殊情况的判断 只有一个点
            if(row-i==i && col-i==i){
                list.add(matrix[i][i]);
                return list;
            }
            for (int c=i;c<=col-i;c++){
                list.add(matrix[i][c]);
            }
            for (int r=i+1;r<=row-i;r++){
                list.add(matrix[r][col-i]);
            }
            //此时只有一行
            if(row-i!=i){//去重
                for(int c=col-i-1;c>=i;c--){
                    list.add(matrix[row-i][c]);
                }
            }
            //此时只有一列
            if(col-i!=i) {//去重
                for (int r = row - i-1; r > i; r--) {
                    list.add(matrix[r][i]);
                }
            }
            return list;
    }