思路:
首先判断循环退出的条件: 5x5 矩阵 [2][2] 6*6 [2][2] 只要 col> 2*k && row> 2*k [K][K]最后一次打印的起始位置
然后循环打印数组:
上面一行:没有限制条件
右面一列:只有中止行数>起始行数
下面一行:中止行数>起始行数 && 中止列数>起始列数 至少两行两列
最左边一列:中止行数>(起始行数-1) && 中止列数>起始列数 至少三行两列
利用k控制循环打印的轮次,求出当前打印轮次的中止endX,endY;控制打印的条件
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> res=new ArrayList<>();
if(matrix==null || matrix.length==0 || matrix[0].length==0){
return res;
}
int m=matrix.length;
int n=matrix[0].length;
// 控制循环的轮次
int k=0;
while(m > 2*k && n> 2*k){
int endX=m-1-k;
int endY=n-1-k;
// 从左到右打印
for(int i=k;i<=endY;i++){
res.add(matrix[k][i]);
}
// 从上到下
if(endX>k){
for(int j=k+1;j<=endX;j++){
res.add(matrix[j][endY]);
}
}
// 从右到左
if(endX>k && endY>k){
for(int i=endY-1;i>=k;i--){
res.add(matrix[endX][i]);
}
}
// 从下到上
if(endX>(k+1) && endY>k){
for(int j=endX-1;j>k;j--){
res.add(matrix[j][k]);
}
}
k++;
}
return res;
}