給定一個包含 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;
}