Leetcode 54. 螺旋矩阵

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix

给你一个 m 行 n 列的矩阵 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]

提示:

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

模拟
模拟矩阵螺旋遍历的过程。要点如下:

  • 遍历到边缘时会改变方向。用数组 dirX 和 dirY 来维持方向向量;
  • 因为最多有4个方向,故添加一个变量dir来记录总共变向的次数。由于方向只会顺时针变化,使用 dir%4 可以很方便修改方向向量;
  • 观察题目要求:矩阵中的数字均小于100,故用101来标记已经遍历过的数字,不需要像官方回答一样单独声明一个矩阵来维持遍历路径。
class Solution {
    int[] dirX = {0, -1, 0, 1};
    int[] dirY = {1, 0, -1, 0};

    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> ans = new ArrayList<>();
        int dir = 0, x = 0, y = 0;
        ans.add(matrix[0][0]);
        matrix[0][0] = 101;
        for(int i=0;i<matrix.length*matrix[0].length;i++){
            if(x+dirX[dir%4]<matrix.length && y+dirY[dir%4]<matrix[0].length &&
                    x+dirX[dir%4]>=0 && y+dirY[dir%4]>=0 &&
                    matrix[x+dirX[dir%4]][y+dirY[dir%4]] != 101){
                ans.add(matrix[x+dirX[dir%4]][y+dirY[dir%4]]);
                matrix[x+dirX[dir%4]][y+dirY[dir%4]] = 101;
                x += dirX[dir%4];
                y += dirY[dir%4];
            }
            else{
                dir += 1;
                i--;
                if(ans.size()==matrix.length*matrix[0].length){
                    break;
                }
            }
        }
        return ans;
    }
}
posted @ 2021-11-23 19:46  PaB式乌龙茶  阅读(44)  评论(0编辑  收藏  举报