29.顺时针打印矩阵
1 题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
2 题目分析
没有什么复杂的数据结构,按层去模拟即可。
3 代码
/*
顺时针打印矩阵:模拟添加即可,需要四个初始遍历left,right,top,bottom分别表示左右上下的界限,画图参考食用最佳按层模拟
*/
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> order = new ArrayList<>();
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return order;
int rows = matrix.length, cols = matrix[0].length;
int left = 0, right = cols - 1, top = 0, bottom = rows - 1;
while (left <= right && top <= bottom) {
// 第一行
for (int col = left; col <= right; col++) {
order.add(matrix[top][col]);
}
// 左边列
for (int row = top + 1; row <= bottom; row++) {
order.add(matrix[row][right]);
}
// 注意:上面的两个循环会把只有一行或者一列的一维矩阵添加完,因此下面的两个for循环需要进行用left<right&&top<bottom来判断当前层是不是二维的,只有二维的才继续执行。
if (left < right && top < bottom) {
// 下边行
for (int col = right - 1; col > left; col--) {
order.add(matrix[bottom][col]);
}
// 左边列
for (int row = bottom; row > top; row--) {
order.add(matrix[row][left]);
}
}
left++;
right--;
top++;
bottom--;
}
return order;
}