问题描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
问题分析
矩阵的顺时针打印,就是按照正常的流程顺序:从左到右,从上到下,从右到左,从下到上四个方向来打印;
对于最后一圈的打印可能存在比较特殊的情况:
只有一行、只有一列
代码实现
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return new int[0];
}
int rows = matrix.length;
int cloum = matrix[0].length;
int total = rows * cloum;
int[] result = new int[total];
int start = 0;
int index = 0;
while(rows > start*2 && cloum > start*2){
int endX = cloum - start - 1;
int endY = rows - start - 1;
//从左到右打印
for(int i=start; i <= endX; i++){
result[index++] = matrix[start][i];
}
//从上到下打印,可能存在单列的问题
if(start < endY){
for(int j=start+1; j<= endY; j++){
result[index++] = matrix[j][endX];
}
}
//从右往左打印,可能存在单行的可能性
if(start < endX && start< endY){
for(int k=endX-1; k >= start; k--){
result[index++] = matrix[endY][k];
}
}
//从下往上打印,需要注意的是可能存在单列的可能性
if(start < endX && start < endY){
for(int s=endY-1; s > start; s--){
result[index++] = matrix[s][start];
}
}
start++;
}
return result;
}
}