19.螺旋矩阵

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

示例1:
image

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

示例2:
image

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

代码:

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        //m为矩阵行数,n为矩阵列数
        int m = matrix.length,n = matrix[0].length;
        //dir为方向数组,分别对应向右,向下,向左,向上
        int[][] dir = {{0,1},{1,0},{0,-1},{-1,0}};
        //vis为标记数组,用于标记矩阵某个位置是否被访问过
        int[][] vis = new int[m][n];;
        //list用于存储最终结果
        List<Integer>list = new ArrayList<>();
        //d为方向标记,x,y为当前位置的横纵坐标
        int d = 0,x = 0,y = 0;
        //一共需要遍历m*n个元素
        for(int i = 0;i < m*n;i++){
            //标记当前位置被访问过
            vis[x][y] = 1;
            //将当前元素加入结果
            list.add(matrix[x][y]);
            //根据方向标记向对应方向移动
            int x1 = x + dir[d][0],y1 = y + dir[d][1];
            //如果当前位置出现越界或者已经被标记过了,说明方向有问题,调整方向
            if(x1<0||x1>=m||y1<0||y1>=n||vis[x1][y1] == 1)d = (d+1)%4;
            //确定最后移动后的位置
            x += dir[d][0];
            y += dir[d][1];
        }
        //返回结果
        return list;
    }
}
posted @ 2025-04-18 08:49  回忆、少年  阅读(6)  评论(0)    收藏  举报