54.螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]
示例2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int lenY = matrix.length;
int lenX = matrix[0].length;
int num = lenX * lenY;
int count = 0;
// 遍历下标
int i = 0;
int j = 0;
// 循环次数
int loop = Math.min(lenX, lenY) / 2;
int midX = lenX / 2;
int midY = lenY / 2;
// 偏移量
int offsetX = 1;
int offsetY = 1;
// 结果列表
List list = new ArrayList();
while (loop > 0){
// 上
while (j < lenX - offsetX){
list.add(matrix[i][j]);
count++;
j++;
}
// 右
while (i < lenY - offsetY){
list.add(matrix[i][j]);
i++;
count++;
}
// 下
while (j > offsetX - 1){
list.add(matrix[i][j]);
j--;
count++;
}
// 左
while (i > offsetY - 1){
list.add(matrix[i][j]);
i--;
count++;
}
loop--;
offsetX++;
offsetY++;
i++;
j++;
if(count == num){
return list;
}
}
if(lenX < lenY){
for(;i < lenY - Math.min(lenX, lenY) / 2;i++){
list.add(matrix[i][j]);
}
}
if(lenX > lenY){
for(;j < lenX - Math.min(lenX, lenY) / 2;j++){
list.add(matrix[i][j]);
}
}
if(lenX == lenY && lenX % 2 != 0){
list.add(matrix[midX][midY]);
}
return list;
}
}
