给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 :

LeetCode:54. 螺旋矩阵_i++

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

这个还是需要仔细观察,其实我们是在绕圈,绕一圈,小一圈。

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        //用4个数定义4个顶点。
        int top = 0,left = 0,down=matrix.length-1,right=matrix[0].length-1;

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

        //由于是转圈,所以每走完一圈就缩小一圈,循环走完。
        while (top<=down && left<=right){

            //上边从左->右。
            for(int i=left;i<=right;i++){
                list.add(matrix[top][i]);
            }

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

            //需要注意:就是当top=down 或者left=right的时候,最后一圈不是圈是一条线,并且在前面两种情况已经打印,这里不能重复打印。
            if(top<down && left<right) {
                //下边从右->左
                for (int i = right - 1; i >= left; i--) {
                    list.add(matrix[down][i]);
                }

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

            //走完一圈后缩小一圈,循环。
            left++;
            right--;
            top++;
            down--;

        }

        return list;
    }
}

时间复杂度:O(m*n),空间复杂度:O(1)