前言
最近在刷《剑指offer》算法题,看到了顺时针打印矩阵的题目,感觉作者处理这个题目时逻辑有点复杂,是通过找规律解决的,我想这种方式如果真的在面试时估计很难想出来,因此自己思考,使用最简单直观的方式来解决。
题目
输入一个矩阵,按照从外往里以顺时针的顺序依次打印每一个数,如下:
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行(列增加),接下来是打印第3列(行增加),接着打印第3行(列减小),接着打印第0列(行减小,最后不要重复打印第一个数字)。因此思路十分清晰,分类打印即可。
接着是打印次外层,还是上面的思路,所以显然想到用到递归的方式完成。
同时还需要考虑到特殊情况,比如只有一行或者只有一列。
代码
public static void printMatrixOrder(int[][] matrix,int minRow,int minCol,int maxRow,int
maxCol){
if(matrix == null){
return;
}
if(maxCol == 0){//单行
for(int i=minRow;i<=maxRow;i++){
System.out.print(matrix[i][0] +" ");
}
}else if(maxRow == 0){//单列
for(int i=minCol;i<=maxCol;i++){
System.out.print(matrix[0][i] +" ");
}
}else{//非单行单列
int curRow = minRow;
int curCol = minCol;
//行不变,列增大
for(;curCol<=maxCol;curCol++){
System.out.print(matrix[curRow][curCol] +" ");
}
System.out.println();
curCol--;
curRow++;
//列不变,行增大
for(;curRow<=maxRow;curRow++){
System.out.print(matrix[curRow][curCol] +" ");
}
System.out.println();
curRow --;
curCol --;
//行不变,列减小
for(;curCol>=minCol;curCol--){
System.out.print(matrix[curRow][curCol] +" ");
}
System.out.println();
curCol ++;
curRow --;
//列不变,行减小
for(;curRow>minRow;curRow--){
System.out.print(matrix[curRow][curCol] +" ");
}
System.out.println();
if(minCol +1< maxCol && minRow +1 <maxRow){
printMatrixOrder(matrix, minRow+1, minCol+1, maxRow-1, maxCol-1);
}
}
}
结果测试
测试用例
image.png
测试结果
image.png
备注:这里为了直观,用换行的方式显示了。
网友评论