App下载 微信公众号

“之”字形打印矩阵

其他 /  作者【吾非言】/ 发布于2022-8-26/ 2.18k次浏览
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}
        });
    }
}
感谢您使用伴职平台,如有侵权,请投诉删除!

全部评价

最新
查看更多评论 加载