题解
- 题意:给定一个矩阵,要求从外围内内围顺时针打印里面的每一个数据。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
-
题解:这题我们使用一个指针模拟顺时针的顺序,因此需要注意到什么时候指针要换方向。
- 从左上角开始,顺时针移动的方向有哪些?
- 右 - 下 - 左 - 上,因此可以利用两个数组来表示这几个方向
dy[]={1,0,-1,0}, dy[] = {0,1,0,-1}
,然后移动就是nx = x + dx[x], ny = y+dy[d]
,其中d
就是方向标志,利用d++,和d%=4
就可以完成整个模拟操作。
- 右 - 下 - 左 - 上,因此可以利用两个数组来表示这几个方向
- 那么什么时候换方向呢?
- 横纵坐标越界
(nx < 0 || nx >= n || ny < 0|| ny >= m)
- 移动的时候发现下一个元素是之前访问过的,
vis[nx][ny]==true
- 横纵坐标越界
- 从左上角开始,顺时针移动的方向有哪些?
-
实现
class Solution {
public int[] spiralOrder(int[][] matrix) {
int []dx = {0,1,0,-1};
int []dy = {1,0,-1,0};
int d = 0;
int n = matrix.length;
if(n == 0) return new int[0];
int m = matrix[0].length;
if(m == 0) return new int[0];
int []res = new int [n*m];
boolean [][]vis = new boolean[n][m];
for(int x = 0, y = -1, k = 0;k < n*m; k++){
int nx = x + dx[d];
int ny = y + dy[d];
if(nx < 0 || nx >= n || ny < 0|| ny >= m||vis[nx][ny]==true){
d++;
d%=4;
nx = x+dx[d];
ny = y+dy[d];
}
x = nx;
y = ny;
res[k] = matrix[x][y];
vis[x][y] = true;
}
return res;
}
}