【题目描述】
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
(原题地址)
【样例示例】
示例 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开始一个个打印,步骤如下:
- 初始化上下左右的值:
left,right,top,bottom
,存储打印数字的数组a
, - 第一步:第一行从左往右打印,存进
a
,存完后top+1
,如果top>bottom
,说明上下循环完毕,已经遍历完全部了,跳出循环; - 第二步:最后一列从上往下打印,存进
a
,存完后right-1
,如果right<left
,说明左右循环完毕,已经遍历完全部了,跳出循环; - 第三步:最后一行从右往左打印,存进
a
,存完后bottom-1
,如果bottom<top
,说明上下循环完毕,已经遍历完全部了,跳出循环; - 第四步:第一列从下往上打印,存进
a
,存完后left+1
,如果left>right
,说明左右循环完毕,已经遍历完全部了,跳出循环; - 从第一步继续循环,直到跳出循环,打印完全部数字。
class Solution {
public int[] spiralOrder(int[][] matrix) {
// 特判
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return new int[0];
}
int flag=0; // 存储数组位置
int rows = matrix.length, columns = matrix[0].length;
int left = 0, right = columns - 1, top = 0, bottom = rows - 1;
int a[] = new int[rows*columns];
while(true) {
// 从左往右打印
for(int i=left;i<=right;i++) {
a[flag++] = matrix[top][i];
}
// 第一行打印完毕,下次将从第二行开始
top++;
if(top>bottom)
break;
// 从上往下打印
for(int i=top;i<=bottom;i++) {
a[flag++] = matrix[i][right];
}
// 最后一列打印完毕,下次将从倒数第二列开始
right--;
if(right<left)
break;
// 从右往左打印
for(int i=right;i>=left;i--) {
a[flag++] = matrix[bottom][i];
}
// 最后一行打印完毕,下次将从倒数第二列开始
bottom--;
if(bottom<top)
break;
// 从下往上打印
for(int i=bottom;i>=top;i--) {
a[flag++] = matrix[i][left];
}
// 第一列打印完毕,下次将从第二列开始
left++;
if(left>right)
break;
}
return a;
}
}