【力扣算法19-2】 解题思路+注释 :54. 螺旋矩阵

236 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情


题目、54. 螺旋矩阵

原题链接:54. 螺旋矩阵

题目描述

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

示例 1:

在这里插入图片描述 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]

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

/

示例 2:

在这里插入图片描述

输入: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]

解题思路

为了让矩阵能按照顺时针螺旋顺序遍历,我们可以先观察,总结这样遍历的特点,而且很轻易就能发现,螺旋矩阵的遍历总是先向左、向下、再向上,最后又向左的,那么我们就可以从这个规律着手。

为了按照旋转矩阵的规律遍历,我们可以设置一个用于翻转数组,改变遍历方向的数组move[][]内容如下:

  1. {0,1}让矩阵向右遍历 行下标row + 0,列下标col + 1
  2. {1,0}让矩阵向下遍历 行下标row + 1,列下标col + 0
  3. {0,-1}让矩阵向左遍历 行下标row + 0,列下标col + -1
  4. {-1,0}让矩阵向上遍历 行下标row + -1,列下标col + 0

我们一边遍历,一边将扫描过的元素存入集合,同时标记扫描过的位置。

当下一个位置没有越界 或 遍历过,就照常遍历,遇到越界 或 扫描过的位置,就利用数组move,改变遍历方向。

重复操作,知道遍历完成即可。

提交代码

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();       //创建集合,记录顺时针螺旋顺序

        //如果矩阵为空或不含元素,返回空集合
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0) 
        return list;

        //获取矩阵的长度rows与高度cols
        int rows = matrix.length;
        int cols = matrix[0].length;
        //定义一个标记矩阵flag,与matrix大小一致,用于标记相同位置上被遍历过的元素
        boolean[][] flag = new boolean[rows][cols];
        //定义一个用于翻转矩阵的二维数组
        //第一行代表向右遍历
        //第二行代表向下遍历
        //第三行代表向左遍历
        //第四行代表向上遍历
        int[][] move = {{0,1},{1,0},{0,-1},{-1,0}};
        //记录当前行、当前列和遍历方向的下标index
        int row = 0,col = 0,index = 0;

        for(int i = 0;i < rows*cols;++i){
            //开始遍历,标记遍历过的位置
            list.add(matrix[row][col]);
            flag[row][col] = true;

            //记录下一位置的行下标和列下标
            int nextRow = row + move[index][0];
            int nextCol = col + move[index][1];

            //如果下一个位置越界或者被遍历过
            if(nextRow < 0 || nextRow >= rows ||
               nextCol < 0 || nextCol >= cols ||
               flag[nextRow][nextCol]){
                   //翻转矩阵进行螺旋遍历
                   index = (index+1)%4;
               }
            
            //向后一个位置挪动
            row += move[index][0];
            col += move[index][1];
            
        }
        return list; //返回按照顺时针螺旋顺序存放元素的集合
        
    }
}

提交结果

在这里插入图片描述