class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int INF=101; //INF相当于visited的作用 每次将一个坐标添加进ans结果中后 将次坐标数据更改为INF表示已经访问过
List<Integer>ans=new ArrayList<>(); //ans数组存放最终的答案
int m=matrix.length; //m为矩阵的横坐标总数
int n=matrix[0].length; //n为矩阵的纵坐标总数
int [][]dirs=new int[][]{{0,1},{1,0},{0,-1},{-1,0}}; //表示移动方向的数组(注意顺序不能瞎写) 通过d来选择命中
//例如d为0时 命中dirs数组的第一个 变化为 横不变 纵坐标加一 即坐标即将向右移动一格
for(int x=0,y=0,d=0,i=0;i<m*n;i++){ //一共添加m*n个坐标进去 所以共m*n个循环
ans.add(matrix[x][y]); //在每一个循环的第一步就完成添加
matrix[x][y]=INF; //添加后就立刻打上标记 相当于VISITED
int nx=x+dirs[d][0]; // nx是下一个坐标的横坐标 第一次时d为0 所以横坐标其实是不变的
int ny=y+dirs[d][1]; //ny是下一个坐标的纵坐标 第一次纵坐标加一 即马上遍历右边的格子
if(nx<0||nx>=m||ny<0||ny>=n||matrix[nx][ny]==INF){
//上面的nx ny是假设阶段的 因为你往右移动一格会存在越界风险 或者已经访问过 需要对nx ny进行判断
d=(d+1)%4; //d的变化情况 d用来命中dirs数组 d为1 命中dirs的[1,0]
nx=x+dirs[d][0]; //注意:nx刚刚if判断越界了 该换方向了 不是向右走了 而是转弯向下走 纵坐标不变 横坐标加一
ny=y+dirs[d][1];//完成这两行的nx ny变化后 这时nx ny一定满足要求 不越界
} //nx ny已经计算出来了 且满足要求 下面要将他们修改进新的xy了 准备遍历新的x y坐标的格子
x=nx; //正式更改x y的值 马上进入for的下一层循环 将新的x y坐标加入ans
y=ny;
}
return ans; //在m*n次 即所有的格子都完成遍历 返回结果数组
}
}
力扣54题:螺旋矩阵的代码与思路
于 2023-03-19 13:15:40 首次发布