剑指offer 面试必考题 40. 顺时针打印矩阵 java

Acwing 40. 顺时针打印矩阵 java面试必考题

原题链接

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

数据范围
矩阵中元素数量 [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]

题解

(模拟) O(n2)
我们顺时针定义四个方向:上右下左。
从左上角开始遍历,先往右走,走到不能走为止,然后更改到下个方向,再走到不能走为止,依次类推,遍历 n2个格子后停止。

class Solution {
    public int[] printMatrix(int[][] matrix) {
       
         if(matrix == null || matrix.length == 0 || matrix[0].length == 0){//先判断是否为0 
            return new int[0];
        }
         int n = matrix.length, m = matrix[0].length;
          int [] res = new int[n*m];
        int[] dx = {-1,0,1,0};int[] dy = {0,1,0,-1};//上右下左
        boolean[][] stu = new boolean[n][m];//判定是否走过
        int x = 0 , y = 0 , d = 1 ;//起始点是0,0 方向是右
        for(int i = 0 ; i < res.length ; i++){
            res[i] = matrix[x][y];
            stu[x][y] = true ;
            int a = x + dx[d] ;
            int b = y + dy[d];
            if(a < 0 || a >= n || b < 0 || b >= m || stu[a][b] ){//撞墙之后 在重新计算下一个位置
                d = (d + 1)% 4 ; 
               a = x + dx[d];
              b = y + dy[d];
            }
            x = a ; y = b ;
        }
        return res ; 
        
    }
}
posted @ 2022-10-11 20:08  依嘫  阅读(32)  评论(0)    收藏  举报