54. Spiral Matrix
顺时针打印矩阵,重点在于行列的取值范围。首先算出圈数cycle
(行列的最小值一半的上界,画一下图就知道了),然后取变量i在cycle
中进行循环打印。
- 打印最上行:行不变列变,坐标:
[i][j]
,列的取值范围:[i, col - i)
- 打印最右列:行变列不变,坐标:
[j][col - i - 1]
,行的取值范围:[i + 1, row - i)
- 打印最下行:行不变列变,坐标:
[row - i - 1][j]
,列的取值范围:[col - i - 2, i]
,并且当前行不可以等于最后一行:i != row - i - 1
(防止重复打印同一行) - 打印最左列:行变列不变,坐标:
[j][i]
,行的取值范围:[row - i - 2, i)
,并且当前列不可等于最后一列i != col - i - 1
(防止重复打印同一列)
matrix注意判空,防止列数为0
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
if (matrix == null || matrix.length == 0) return res;
int row = matrix.length;
int col = matrix[0].length;
int cycle = ((row < col ? row : col) + 1) / 2;
for (int i = 0; i < cycle; i++) {
for (int j = i; j < col - i; j++) {
res.add(matrix[i][j]);
}
for (int j = i + 1; j < row - i; j++) {
res.add(matrix[j][col - i - 1]);
}
for (int j = col - i - 2; j >= i && i != row - i - 1; j--) {
res.add(matrix[row - i - 1][j]);
}
for (int j = row - i - 2; j > i && i != col - i - 1; j--) {
res.add(matrix[j][i]);
}
}
return res;
}