顺时针打印矩阵
描述
输入一个矩阵,按照从外向里以顺时针的顺序(螺旋向内)依次打印出每一个数字。
代码 (Java)
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0)
return new ArrayList<>();
ArrayList<Integer> result = new ArrayList<>();
int rows = matrix.length, columns = matrix[0].length;
int start = 0; // 记录圈数,每圈(start, start)作为起点
while (rows > start * 2 && columns > start * 2) {
PrintMatrixInCircle(matrix, rows, columns, start, result);
++start;
}
return result;
}
public void PrintMatrixInCircle(int[][] matrix, int rows, int columns, int start, ArrayList<Integer> result) {
int endX = columns - 1 - start;
int endY = rows - 1 - start;
// 从左到右打印一行
for (int i = start; i <= endX; ++i)
result.add(matrix[start][i]);
// 从上到下打印一列(这一步需要的前提是终止行号大于起始行号)
if (start < endY) {
for (int i = start + 1; i <= endY; ++i)
result.add(matrix[i][endX]);
}
// 从右到左打印一行(这一步需要的前提是至少有两行两列)
if (start < endX && start < endY) {
for (int i = endX - 1; i >= start; --i)
result.add(matrix[endY][i]);
}
// 从下到上打印一行(这一步需要的前提是至少有三行两列)
if (start < endX && start < endY - 1) {
for (int i = endY - 1; i >= start + 1; --i)
result.add(matrix[i][start]);
}
}
}