输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
数据范围:
矩阵中元素数量 [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;
}
}