【题目】 给定一个矩阵matrix,按照“之”字形的方式打印这
个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12
“之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11,
8,12
【要求】 额外空间复杂度为O(1)。
PS:我原本是想画图解释的,但是图片一直传不上去,简书这个图片上传问题存在好久了,现在我考虑换个平台写了。
解题思路
(1)定义两个坐标A、B。一开始他们都在左上角的位置。
(2)A先向右移,移到最右一列后,再向下移,直到移到最后一行,停止。
B向下移,移到最后一行后,再向右移,直到移到最后一列,停止。
(3)写一个循环,终止条件是A的行号来到最后一行。
-
如果A没有来到最后一列,它的行号就不变,列号每次加1;如果B没有来到最后一行,它的列号就不变,行号每次加1。
-
当A来到最后一列,它的列号就不变了,行号每次加1;当B来到最后一行,它的行号就不变了,列号每次加1。
(4)设定一个布尔变量,用来判断当前的打印顺序是从 左下 -> 右上 or 右上 -> 左下,每次循环就反转一次。
public class ZigZagPrintMatrix {
public static void printMatrixZigZag(int[][] matrix) {
int aRow = 0;
int aColumn = 0;
int bRow = 0;
int bColumn = 0;
int endR = matrix.length - 1; // 终止行
int endC = matrix[0].length - 1; // 终止列
boolean fromUp = false; // 判断打印顺序从 左下 -> 右上 or 右上 -> 左下
while (aRow != endR + 1) {
printLevel(matrix, aRow, aColumn, bRow, bColumn, fromUp);
aRow = aColumn == endC ? aRow + 1 : aRow;
aColumn = aColumn == endC ? aColumn : aColumn + 1;
bColumn = bRow == endR ? bColumn + 1 : bColumn;
bRow = bRow == endR ? bRow : bRow + 1;
fromUp = !fromUp;
}
System.out.println();
}
public static void printLevel(int[][] m, int aRow, int aColumn, int bRow, int bColumn, boolean f) {
if (f) { // 右上 -> 左下
while (aRow != bRow + 1) {
System.out.print(m[aRow++][aColumn--] + " ");
}
} else { // 左下 -> 右上
while (bRow != aRow - 1) {
System.out.print(m[bRow--][bColumn++] + " ");
}
}
}
public static void main(String[] args) {
int[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
printMatrixZigZag(matrix);
}
}
网友评论