题目 给定一个矩阵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)。
思路 设起始点为[0,0]坐标处的点。设置两个游走点A和B,起始都位于[0,0]。每一次A往右走一步,B往下走一步,二者连成一条对角线为待打印的对角线。若A往右走到头则转向往下走,若B往下走到头则转向往右走。待打印对角线的打印方向用一个布尔类型的值标记一下即可。
package algorithm.section4;
public class printMatrixZigZag {
public static void printZigZag(int[][] matrix){
if (matrix == null) return;
int aR = 0;
int aC = 0;
int bR = 0;
int bC = 0;
boolean flag = false;
while (aR != matrix.length){
print(matrix, aR, aC, bR, bC, flag);
aR = aC == matrix[0].length - 1 ? aR + 1 : aR;
aC = aC == matrix[0].length - 1 ? aC : aC + 1;
bC = bR == matrix.length - 1 ? bC + 1 : bC;
bR = bR == matrix.length - 1 ? bR : bR + 1;
flag = !flag;
}
}
public static void print(int[][] matrix, int aR, int aC, int bR, int bC, boolean flag){
if (!flag){
for (int i = bC; i <= aC; i++)
System.out.print(matrix[bR--][i] + " ");
} else {
for (int i = aR; i <= bR; i++)
System.out.print(matrix[i][aC--] + " ");
}
}
public static void main(String[] args){
int [][] matrix = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
printZigZag(matrix);
}
}