描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:
[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]
则依次打印出数字
[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
数据范围:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
示例1
输入:[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
返回值:[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
示例2
输入:[[1,2,3,1],[4,5,6,1],[4,5,6,1]]
返回值:[1,2,3,1,1,1,6,5,4,4,5,6]
把外圈所有循环打印出来,这是他的规律
因此,只要把一个圈打印出来,按照循环来即可。
所以将左右边界点,上下边界点作为循环条件,将四条边打印
每个下标发生变化时,需要判断是否还符合循环条件,有可能不是正方形的矩阵,但是循环会一直跑,即每个下标变化时,由下方的代码If来判断。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> result = new ArrayList<>();
int iLeft = 0, iRight = matrix.length - 1;
int jLeft = 0, jRight = matrix[0].length - 1;
while (iLeft <= iRight && jLeft <= jRight) {
// 第一行
for (int i = jLeft; i <= jRight; i++) {
result.add(matrix[iLeft][i]);
}
// 最后一列
iLeft++;
if (iRight < iLeft) {
break;
}
for (int i = iLeft; i <= iRight; i++) {
result.add(matrix[i][jRight]);
}
// 最后一行
jRight--;
if (jRight < jLeft) {
break;
}
for (int i = jRight; i >= jLeft; i--) {
result.add(matrix[iRight][i]);
}
// 第一列
iRight--;
if (iRight < iLeft) {
break;
}
for (int i = iRight; i >= iLeft; i--) {
result.add(matrix[i][jLeft]);
}
jLeft++;
if (jLeft > jRight) {
break;
}
}
return result;
}
}