图片说明
对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于(up,left),右下角位于(down,right),按照如下顺序遍历当前层的元素。
从左到右遍历上侧元素,依次为(up,left)到(up,right)。
从上到下遍历右侧元素,依次为(up+1,right+1)到(down,right)。
如果left<right且up<down,则从右到左遍历下侧元素,依次为(down,right-1)到(down,left+1),以及从下到上遍历左侧元素,依次为(down,left)到(up+1,left)。
遍历完当前层的元素之后,将up和down分别增加,将right和left分别减少,进入下一层继续遍历,直到遍历完所有元素为止。
图片说明
时间复杂度:O(n * m) n,m分别表示矩阵的行数和列数
空间复杂度:O(n * m) 需要用二维数组来储存结果
优缺点:比较难实现 但是相比之下在时间和空间上比较优

import java.util.*;

public class Solution {
    public ArrayList<Integer> spiralOrder(int[][] matrix) {

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

        if (matrix == null || matrix.length == 0) {
            return result;
        }

        int left = 0;
        int right = matrix[0].length - 1;
        int up = 0;
        int down = matrix.length - 1;

        while (left <= right && up <= down) {

            for (int column = left; column <= right; column++) {
                result.add(matrix[up][column]);
            }

            for (int row = up + 1; row <= down; row++) {
                result.add(matrix[row][right]);
            }

            //left < down防止情况:{{3},{2}} 实际输出:[3,2,2]
            //up < down防止情况[[6,9,7]]实际输出[6,9,7,9]
            if (left < right && up < down) {
                for (int reverseColumn = right - 1; reverseColumn > left; reverseColumn--) {
                    result.add(matrix[down][reverseColumn]);
                }

                for (int reverseRow = down; reverseRow > up; reverseRow--) {
                    result.add(matrix[reverseRow][left]);
                }
            }

            left++;
            right--;
            up++;
            down--;
        }

        return result;
    }
}