“之”字形打印矩阵
2022
8/26
3:44
给定一个矩阵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)
解题思路:
上坐标(tR, tC)初始化为(0, 0),先沿着矩阵第一行移动(tC++),当到达第一行最右边的元素后,在沿着矩阵最后一列移动(tR++)。
下坐标(dR, dC)初始为(0,0),先沿着矩阵第一列移动(dR++),当到达第一列最下边的元素时,再沿着矩阵最后一行移动(dC++)。
上坐标与下坐标同步移动,每次移动后的上坐标与下坐标的连线就是矩阵中的一条斜线,打印斜线上的元素即可。
如果上次斜线是从左下向右上打印的,这次一定是从右上向左下打印,反之亦然。总之,可以把打印的方向用boolean值表示,每次取反即可。
代码实现:
public class Solution_110 {
/**
* 给定一个矩阵matrix,按照“之”字形的方式打印矩阵,例如:
* <p>
* 1 2 3 4
* 5 6 7 8
* 9 10 11 12
* <p>
* “之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12
* <p>
* 要求:额外空间复杂度为O(1)
*/
public void printMatrixZigZag(int[][] matrix) {
if (matrix == null || matrix.length == 0) return;
int rows = matrix.length - 1;
int cols = matrix[0].length - 1;
// (tR, tC)左上角坐标,先从左向右,然后从上向下变化
int tR = 0, tC = 0;
// (bR, bC)右下角坐标,先从上向下,然后从左向右变化
int bR = 0, bC = 0;
boolean isUp = true;
while (tR != rows + 1) {
print(tR, tC, bR, bC, isUp, matrix);
tR = tC == cols ? tR + 1 : tR;
tC = tC == cols ? tC : tC + 1;
bC = bR == rows ? bC + 1 : bC;
bR = bR == rows ? bR : bR + 1;
isUp = !isUp;
}
}
// (0, 0)
// (0, 1)、(1,0)
// (2, 0) (1, 1) (0, 2)
// (0, 3) (1, 2) (2, 1)
private void print(int tR, int tC,
int bR, int bC,
boolean isUp, int[][] matrix) {
if (isUp) {
// 从下往上
// bR不断减小,以至于接近tR
while (bR != tR - 1) {
System.out.println(matrix[bR--][bC++]);
}
} else {
// 从上往下
// tR不断增加,以至于接近bR
while (tR != bR + 1) {
System.out.println(matrix[tR++][tC--]);
}
}
}
public static void main(String[] args) {
Solution_110 solution_110 = new Solution_110();
solution_110.printMatrixZigZag(new int[][]{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
});
}
}
感谢您使用伴职平台,如有侵权,请投诉删除!

