给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
直接用模拟法即可。定义上下左右四个边界,每向一个方向遍历一次后,将边界移动,然后判断边界是否合法,不合法说明遍历完了,可直接返回list
public List<Integer> spiralOrder(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) {
return new ArrayList<>();
}
List<Integer> list = new ArrayList<>();
int rowUp = 0;
int rowDown = matrix.length - 1;
int colLeft = 0;
int colRight = matrix[0].length - 1;
int direction = 0;
while (direction != -1) {
if (direction == 0) {
//往右
for (int i = colLeft; i <= colRight; i++) {
list.add(matrix[rowUp][i]);
}
rowUp++;
if (rowUp > rowDown) {
return list;
}
direction = 1;
} else if (direction == 1) {
//往下
for (int i = rowUp; i <= rowDown; i++) {
list.add(matrix[i][colRight]);
}
colRight--;
if (colRight < colLeft) {
return list;
}
direction = 2;
} else if (direction == 2) {
//往左
for (int i = colRight; i >= colLeft; i--) {
list.add(matrix[rowDown][i]);
}
rowDown--;
if (rowDown < rowUp) {
return list;
}
direction = 3;
} else if (direction == 3) {
//往上
for (int i = rowDown; i >= rowUp; i--) {
list.add(matrix[i][colLeft]);
}
colLeft++;
if (colLeft > colRight) {
return list;
}
direction = 0;
}
}
return list;
}