1. 题目
2. 解题思路
- 用四个边界变量:
left
(左边界)right
(右边界)up
(上边界)down
(下边界)
- 每次按照顺时针方向走一圈:左→右 → 上→下 → 右→左 → 下→上
- 每走完一条边,就把对应的边界向内收缩。
- 每次收缩后立刻检查是否交叉(即越界),如果交叉说明遍历完了,就
break
。
3. 代码
3.1. 完整代码
java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int left = 0;
int right = n-1;
int up = 0;
int down = m-1;
List<Integer> res = new ArrayList<>();
while (true) {
//1. 从左往右
for (int i = left; i <= right; i++) {
//行不变
res.add(matrix[up][i]);
}
up++;
if (up > down) {
break;
}
//2. 从上往下
for (int i = up; i <= down; i++) {
//列不变
res.add(matrix[i][right]);
}
right--;
if (right < 0 || left > right) {
break;
}
//3. 从右往左
for (int i = right; i >= left; i--) {
//行不变
res.add(matrix[down][i]);
}
down--;
if (down < 0 || up > down) {
break;
}
//4. 从下往上
for (int i = down; i >= up; i--) {
//列不变
res.add(matrix[i][left]);
}
left++;
if (left > right) {
break;
}
}
return res;
}
}