模拟法
- 参考代码随想录:代码随想录-螺旋矩阵
- 首先,需要确定定义边界的规则,从而确定模拟的区间,比如采用左闭右开,左闭右闭等。本题建议采用左闭右开,也就是起点闭合,终点打开。
- 其次,循环次数也很重要,用来确定模拟什么时候结束。本题每转一圈是走2行和2列,因此模拟次数为行数和列数中最小值的一半。
- 如果为奇数行或奇数列,每次走2行2列,最后会剩下1行或1列,因此最后需要模拟打印剩下的1行或一列。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> res = new ArrayList<>();
if(matrix == null || matrix.length == 0)
return res;
int m = matrix.length, n = matrix[0].length;
int minIdx = Math.min(m, n);
int loop = minIdx / 2;
int startx = 0, starty = 0;
int offset = 1;
int i, j;
while(0 < loop--){
i = starty;
j = startx;
for(; j < startx + n - offset; j++)
res.add(matrix[i][j]);
for(; i < starty + m - offset; i++)
res.add(matrix[i][j]);
for(; j > startx; j--)
res.add(matrix[i][j]);
for(; i > starty; i--)
res.add(matrix[i][j]);
startx++;
starty++;
offset += 2;
}
if(minIdx % 2 == 1){
i = starty;
j = startx;
if(m <= n){
while(j <= startx + n - offset){
res.add(matrix[i][j]);
j++;
}
} else {
while(i <= starty + m - offset){
res.add(matrix[i][j]);
i++;
}
}
}
return res;
}
}