题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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
思路:
逆时针一圈是一个大循环,每个大循环中有四个小循环。
每次大循环要确定边界,即,四个顶点的坐标。
每个小循环,都只有行或列变化,要确定起始和结束的值,以及变化的趋势,即是增加还是减少。
每次小循环结束后要检查是否已经遍历所有的元素了。
代码:
class Solution {
public int[] spiralOrder(int[][] matrix) {
//特殊情况处理
if(matrix == null) {
return new int[0];
}
int rows = matrix.length;
if(rows == 0) {
return new int[0];
}
int cols = matrix[0].length;
if(cols == 0) {
return new int[0];
}
//初始化四个顶点的值
int leftTopRow = 0,leftTopCol = 0;
int leftBottomRow = rows - 1, leftBottomCol = 0;
int rightTopRow = 0, rightTopCol = cols - 1;
int rightBottomRow = rows - 1, rightBottomCol = cols - 1;
int num = cols * rows;
int[] res = new int[num];
int n = 0;
while(n < num) {
//左上-》右上
int i = leftTopRow;
int j = leftTopCol;
for(; j < rightTopCol + 1; j ++) {
res[n ++] = matrix[i][j];
}
if(n == num) {
break;
}
//右上-》右下
i = rightTopRow + 1;
j = rightTopCol;
for(; i < rightBottomRow + 1; i ++) {
res[n ++] = matrix[i][j];
}
if(n == num) {
break;
}
//右下-》左下
i = rightBottomRow;
j = rightBottomCol - 1;
for(; j > leftBottomCol - 1; j --) {
res[n ++] = matrix[i][j];
}
if(n == num) {
break;
}
//左下-》右上
i = leftBottomRow - 1;
j = leftBottomCol;
for(; i > leftTopRow; i --) {
res[n ++] = matrix[i][j];
}
if(n == num) {
break;
}
leftTopRow ++;
leftTopCol ++;
leftBottomRow --;
leftBottomCol ++;
rightTopRow ++;
rightTopCol --;
rightBottomRow --;
rightBottomCol --;
}
return res;
}
}