54. 螺旋矩阵

138 阅读1分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

54. 螺旋矩阵

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

  • 示例 1:

图片.png

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

  • 示例 2:

图片.png

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7] 提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

解题思路

遍历矩阵的最外围元素,递归已经除去最外层的子矩阵。对于每层,从左上方开始以顺时针的顺序遍历所有元素。遍历完当前层的元素之后,将当前矩阵的长和宽都减去2,就是子矩阵的长宽 边界条件:当递归的矩阵长或者宽为1或者2的时候,停止遍历,因为已经不存在更小的矩阵了

代码

class Solution {
  ArrayList<Integer> objects = new ArrayList<>();
    public List<Integer> spiralOrder(int[][] matrix) {
        

        int r=matrix.length,c=matrix[0].length,x=0,y=0;

        put(r,c,x,y,matrix);
        return objects;
    }
    public void put (int r,int c,int x,int y,int[][] matrix)
    {


        //长或者宽为1或者2的边界条件(最小矩阵)
        if(r<=0||c<=0) return;
        if(r==1)
        {
            for (int i=x;i<x+c;i++)
                objects.add(matrix[y][i]);
            return;
        }
        if(c==1)
        {
            for (int i=y;i<y+r;i++)
                objects.add(matrix[i][x]);
            return;
        }


        for (int i=x;i<x+c;i++)//最上一层
            objects.add(matrix[y][i]);


        for (int i=y+1;i<y+r-1;i++)//最右一层
            objects.add(matrix[i][x+c-1]);

        for (int i=x+c-1;i>=x;i--)//最下一层
            objects.add(matrix[y+r-1][i]);

        for (int i=y+r-2;i>y;i--)//最左一层
            objects.add(matrix[i][x]);
        
        put(r-2,c-2,x+1,y+1,matrix);

    }
}

时间复杂度:O(mn),其中 m 和 n 分别是输入矩阵的行数和列数。矩阵中的每个元素都要被访问一次。

空间复杂度:O(1)。除了输出数组以外,空间复杂度是常数。