zoukankan      html  css  js  c++  java
  • [算法]“之”字形打印矩阵

    题目:

    给定一个矩阵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)。

    思路:

    1.上坐标(tR,tC)的初始为(0,0),先沿着矩阵的第一行移动(tC++),当达到第一行最右边的元素后,再沿着矩阵最后一列移动  (tR++)。

    2.下坐标(dR,dC)的初始为(0,0),先沿着矩阵的第一列移动(dR++),当到达第一列最下边的元素时,再沿着矩阵的最后一行一定(dC++)。

    3.上坐标与下坐标同步移动,每次移动后的上坐标与下坐标的连线就是矩阵中的一条斜线,打印斜线上的元素即可。

    4.如果上次斜线是从左下向右上打印的,这次一定是从右上向左下打印,反之亦然。总之,可以把打印的方向用boolean变量表示,每次取反即可。

    程序:

    public static void printMatrixZigZag(int[][] matrix) {
            int tC = 0, tR = 0, dC = 0, dR = 0;
            int endR = matrix.length - 1;
            int endC = matrix[0].length - 1;
            boolean fromUp = false;
            while (tR != endR + 1) {
                printLevel(matrix, tR, tC, dR, dC, fromUp);
                tR = tC == endC ? tR + 1 : tR;
                tC = tC == endC ? tC : tC + 1;
                dC = dR == endR ? dC + 1 : dC;
                dR = dR == endR ? dR : dR + 1;
                fromUp = !fromUp;
            }
        }
        private static void printLevel(int[][] matrix, int tR, int tC, int dR, int dC, boolean fromUp) {
            if (fromUp) {
                while (tR != dR + 1) {
                    System.out.print(matrix[tR++][tC--] + " ");
                }
            } else {
                while (dR != tR - 1) {
                    System.out.print(matrix[dR--][dC++] + " ");
                }
            }
        }
  • 相关阅读:
    第四章——64位软件逆向技术-基本语法(上)
    第三章——静态分析技术-IDA的简单操作
    第二章——动态分析技术-OD常见问题
    工厂模式及其抽象工厂
    设计模式-原则
    设计模式-简单工厂模式
    设计模式-桥接模式
    设计模式
    Linux下安装软件心得
    光驱挂载和下载
  • 原文地址:https://www.cnblogs.com/xiaomoxian/p/5186604.html
Copyright © 2011-2022 走看看