28.顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

数据范围:

矩阵中元素数量 [0,400]。

样例:

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

代码:

class Solution {
    public int[] printMatrix(int[][] matrix) {
        //如果矩阵为空,直接返回空数组
        if(matrix.length == 0||matrix[0].length == 0)return new int[0];
        //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];;
        //res用于存储最终结果
        int[] res = new int[m*n];
        //d为方向标记,x,y为当前位置的横纵坐标,cnt记录res当前存储元素位置
        int d = 0,x = 0,y = 0,cnt = 0;
        //一共需要遍历m*n个元素
        for(int i = 0;i < m*n;i++){
            //标记当前位置被访问过
            vis[x][y] = 1;
            //将当前元素加入结果
            res[cnt++] = 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 res;
    }
}

posted @ 2025-05-21 10:58  回忆、少年  阅读(12)  评论(0)    收藏  举报