- leetcode:54. 螺旋矩阵
- 牛客:BM98 螺旋矩阵
模拟法
- 参考代码随想录:代码随想录-螺旋矩阵
- 首先,需要确定定义边界的规则,从而确定模拟的区间,比如采用左闭右开,左闭右闭等。本题建议采用左闭右开,也就是起点闭合,终点打开。
- 其次,循环次数也很重要,用来确定模拟什么时候结束。本题每转一圈是走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;}
}