54. 螺旋矩阵
题目链接
螺旋枚举
- 使用变量:
- 使用len[]记录两个维度的长度
- 使用marked[][]记录已经枚举过的位置
- 使用pos[]记录当前枚举到的位置
- delta表示下一步的偏移量,i表示下一步要偏移的维度,cnt表示已经枚举过的数量
- 具体算法:
- 每次枚举,先进行偏移,若超出矩阵范围,或是已经枚举过了,就换一个维度,如果已经换过一次维度,就换个方向
- 注意,初始是枚举第二个维度,即方向向右
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int[] len = {matrix.length, matrix[0].length};
List<Integer> ans = new ArrayList<>();
boolean[][] marked = new boolean[len[0]][len[1]];
int[] pos = new int[2];
int delta = 1, i = 1, cnt = 0;
while(cnt < len[0] * len[1]){
ans.add(matrix[pos[0]][pos[1]]);
marked[pos[0]][pos[1]] = true;
cnt++;
pos[i] += delta;
if(pos[i] < 0 || pos[i] >= len[i] || marked[pos[0]][pos[1]]){
pos[i] -= delta;
if(i == 1) i = 0;
else{
i = 1;
delta = -delta;
}
pos[i] += delta;
}
}
return ans;
}
}