剑指 Offer 29. 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入: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]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
题解
注意判断1 × 1、1 × n 、n × 1 的矩阵
Code
class Solution {
public int[] spiralOrder(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
return new int[0];
printMatrix(matrix, list, 0, matrix.length - 1, 0, matrix[0].length - 1);
int[] result = new int[list.size()];
int index = 0;
for(Integer i : list)
result[index++] = i;
return result;
}
public static void printMatrix(int[][] matrix, ArrayList<Integer> list,
int rowBg, int rowEd, int colBg, int colEd){
if(rowBg > rowEd || colBg > colEd){
return;
}
for(int i = colBg; i <= colEd; i++)
list.add(matrix[rowBg][i]);
for(int i = rowBg + 1; i <= rowEd; i++)
list.add(matrix[i][colEd]);
if(rowBg != rowEd){
for(int i = colEd - 1; i >= colBg; i--)
list.add(matrix[rowEd][i]);
}
if(colBg != colEd){
for(int i = rowEd - 1; i > rowBg; i--)
list.add(matrix[i][colBg]);
}
printMatrix(matrix, list, ++rowBg, --rowEd, ++colBg, --colEd);
}
}