题目描述
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入: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]
思路
- 设定四个边界;
- 总是按照右下左上的顺序遍历,每次改变一次方向的时候,改变对应border的值;
- 当leftBorder > rightBorder或者topBorder > bottomBorder的时候,越界了,说明要停止了。
代码
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<>();
int leftBorder = 0;
int rightBorder = matrix[0].length - 1;
int topBorder = 0;
int bottomBorder = matrix.length - 1;
while (true) {
// 从左往右遍历,变化的是列,列的初始值为左border
for (int col = leftBorder; col <= rightBorder; col++) {
// 添加的时候,topBorder是不变的,变化的是列。
result.add(matrix[topBorder][col]);
}
// 遍历结束后,topBorder要+1,相当于最上边一行不要了。
if (++topBorder > bottomBorder) {
break;
}
// 下面逻辑同理,只需要注意变化的是行还是列
for (int row = topBorder; row <= bottomBorder; row++) {
result.add(matrix[row][rightBorder]);
}
if (--rightBorder < leftBorder) {
break;
}
for (int col = rightBorder; col >= leftBorder; col--) {
result.add(matrix[bottomBorder][col]);
}
if (--bottomBorder < topBorder) {
break;
}
for (int row = bottomBorder; row >= topBorder; row--) {
result.add(matrix[row][leftBorder]);
}
if (++leftBorder > rightBorder) {
break;
}
}
return result;
}
}