思路如下:
1、可以看到,遍历的方向是右→下→左→上→右…方向的变化是有规律的,因此我们可以使用两个分别表示x、y方向的数组来定义遍历的方向
2、可以发现,在遇到边界,或者是遇到已经遍历过的数的时候,就会改变方向,因此再定义一个布尔数组表示当前坐标是否已经遍历过
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer>list=new ArrayList<>();
if(matrix.length==0){
return list;
}
int R = matrix.length;
int C = matrix[0].length;
//dr数组表示y方向的数组,dc表示x方向的数组
int []dr = {0,1,0,-1};
int []dc = {1,0,-1,0};
//r、c表示下标,direction表示转向的累积数
int r=0,c=0,direction=0;
//定义布尔数组判断当前坐标是否已经遍历过
boolean[][] bool_matrix=new boolean[R][C];
for(int i=0;i<R*C;i++){
list.add(matrix[r][c]);
/true表示已经遍历过
bool_matrix[r][c]=true;
//r、c在direction方向上往前走一位
int nr=r+dr[direction];
int nc=c+dc[direction];
//如果未超出边界且是碰到的下一个数没有遍历过,就在当前方向上继续走
if(nr>=0&&nr<R&&nc>=0&&nc<C&&!bool_matrix[nr][nc]){
r=nr;
c=nc;
}
else{
//否则要改变方向
direction=(direction+1)%4;
//r、c在改变方向后遍历到下一位
r=r+dr[direction];
c=c+dc[direction];
}
}
return list;
}
}
原题地址:
54. 螺旋矩阵