题目描述:
转圈打印矩阵
【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。
例如:
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
【要求】 额外空间复杂度为O(1)
思路:左上角和右下角正好可以构成一个矩形的边界,所以就从左上角和右下角的行和列出发,从外圈到内圈一圈圈遍历矩阵,然后控制左上角和右下角的行和列进入到内圈,如此重复则可打印完
public class Code_005_PrintMatrixSpiralOreder {
public static void spiralOrderPrint(int[][] matrix) {
int aH = 0; //左上角行
int aL = 0; //左上角列
int bH = matrix.length - 1; //右下角行
int bL = matrix[0].length - 1; //右下角列
while(aH <= bH && aL <= bL) {
//打印边界,每打印完一圈后,进入到内圈
printEdge(matrix, aH++, aL++, bH--, bL--);
}
}
public static void printEdge(int[][] matrix, int aH, int aL, int bH, int bL) {
if (aH == bH) { //处理边界条件,整个矩阵只有一行
for (int i = 0; i < matrix.length; i++) {
System.out.print(matrix[aH][i] + " ");
}
} else if (aL == bL) { //处理边界,整个矩阵只有一列
for (int i = 0; i < matrix.length; i++) {
System.out.print(matrix[i][aL] + " ");
}
} else {
int curL = aL;
int curH = aH;
while(curL != bL) {
System.out.print(matrix[aH][curL++] + " ");
}
while(curH != bH) {
System.out.print(matrix[curH++][bL] + " ");
}
while(curL != aL) {
System.out.print(matrix[bH][curL--] + " ");
}
while(curH != aH) {
System.out.print(matrix[curH--][aL] + " ");
}
}
}
}