import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
if (matrix == null || matrix.length == 0) {
return new ArrayList<>();
}
ArrayList<Integer> list = new ArrayList<>();
int m0 = 0;
int m1 = matrix.length - 1;
int n0 = 0;
int n1 = matrix[0].length - 1;
while (m0 <= m1 && n0 <= n1) {
scan(list, matrix, m0, m1, n0, n1);
m0++;
n0++;
m1--;
n1--;
}
return list;
}
private void scan(ArrayList<Integer> list, int[][] matrix, int m0, int m1, int n0, int n1) {
if (m0 > m1 || n0 > n1) {
return;
}
//当二维数组的最内层只剩下一行或者一列时,最内层遍历的不再是上、右、下、左4条边
//m0行,从n0 到 n1遍历完整
for (int i = n0; i <= n1; i++) {
list.add(matrix[m0][i]);
}
//如果最内层只有一行,那么只执行第一个for循环
if (m0 == m1) {
return;
}
//n1列,从m0+1 行到m1行 遍历完整
//如果m0+1 大于m1,则for 不会执行
for (int i = m0 + 1; i <= m1; i++) {
list.add(matrix[i][n1]);
}
//如果内层只有一列,那么只执行前两个for循环
if (n0 == n1) {
return;
}
//m1行,从n1-1倒序遍历至n0
//若n1-1本身就小于n0,则for 不会执行
for (int i = n1 - 1; i >= n0; i--) {
list.add(matrix[m1][i]);
}
//n0列,从m1-1倒序遍历至m0+1
//
for (int i = m1 - 1; i >= m0 + 1; i--) {
list.add(matrix[i][n0]);
}
}
}