矩阵类题目关键点在于将问题进行拆分,这里就可以拆分成一层一层的矩阵,只要规定好每个矩阵如何螺旋收集外围数字就好了。

    public ArrayList<Integer> spiralOrder(int[][] matrix) {
        ArrayList<Integer> res = new ArrayList<>();
        if(matrix==null||matrix.length==0) return res;
        //左上角和右下角定下一个矩阵,每个矩阵的遍历规定好
        int[] leftTop = {0,0};
        int[] rightBottom = {matrix.length-1,matrix[0].length-1};
        while(leftTop[0]<=rightBottom[0]&&leftTop[1]<=rightBottom[1]){
            collectMatrix(res,leftTop,rightBottom,matrix);
            leftTop[0]+=1;
            leftTop[1]+=1;//右下角移动
            rightBottom[0]-=1;
            rightBottom[1]-=1;//左上角移动
        }
        return res;
    }    
    public void collectMatrix(ArrayList<Integer> res,int[] leftTop,int[] rightBottom,int[][] matrix){
        int[] cur = {leftTop[0],leftTop[1]};
        //一直向右走
        while(cur[1]<rightBottom[1]){
            res.add(matrix[cur[0]][cur[1]]);
            cur[1] += 1;
        }
        //处理单条的情况
        if(leftTop[0]==rightBottom[0]){
            res.add(matrix[cur[0]][cur[1]]);
            return;
        }
        //走不动了就向下
        while(cur[0]<rightBottom[0]){
            res.add(matrix[cur[0]][cur[1]]);
            cur[0] += 1;
        }
        //处理单条的情况
        if(leftTop[1]==rightBottom[1]){
            res.add(matrix[cur[0]][cur[1]]);
            return;
        }
        //走不动就像左
        while(cur[1]>leftTop[1]){
            res.add(matrix[cur[0]][cur[1]]);
            cur[1] -= 1;
        }        
        //走不动就向上
        while(cur[0]>leftTop[0]){
            res.add(matrix[cur[0]][cur[1]]);
            cur[0] -= 1;
        }
    }