题目
给你一个 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 == matrixi.length
1 <= m, n <= 10
-100 <= matrixij <= 100
四个边界值
定义四个边界,如下图所示,走完一圈之后,四个边界同时向里面缩。
- 当up<down,或者left>right的时候说明螺旋结束。
java
up = 0
↓
left → 1 2 3 4 ← right
5 6 7 8
9 10 11 12
↑
down = 2



java
public static List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();
int up = 0;
int down = matrix.length-1;
int left = 0;
int right = matrix[0].length-1;
while(true) {
for(int i = left; i<=right; i++) {
list.add(matrix[up][i]);
}
up++;
if(up>down) {break;}
for(int i = up; i<=down; i++) {
list.add(matrix[i][right]);
}
right--;
if(right<left) {break;}
for(int i = right; i>=left; i--) {
list.add(matrix[down][i]);
}
down--;
if(up>down) {break;}
for(int i = down; i>=up; i--) {
list.add(matrix[i][left]);
}
left++;
if(right<left) {break;}
}
return list;
}
注意每一次边界值变动都要判别,否则可能导致下一步添加新的数字(up>down已经可以跳出,但是 left 和 right 还会在添加数字)

