问题:给定 n 行和 m 列的二维数组矩阵。如图所示,以 ZIG-ZAG 方式打印此矩阵。

  从对称的角度来看,通过反复施加滑行反射可以从简单的图案如线段产生规则的之字形。

  主要思想:算法从(0, 0)位置开始水平向右遍历,当到达(0, 1)时沿着反对角线方向左下遍历(利用一个变量控制左下右上方向),内层循环一直遍历到碰到边缘时row++,方向改为右上,沿着反对角线碰到矩阵上边缘时col++,方向变为左下遍历,知道上半部分(包括反对角线遍历完);遍历完半个矩阵(可能是子方矩阵)后,根据当前 row 索引和 col 索引所在位置来判断延伸方向,若碰到边缘,则对应行列索引数加一,没碰到边缘,则按内层循环的思路延伸,然后相同的思路遍历完矩阵剩下部分。

  算法的时间复杂度为 O(n*m),其中 n, m 为输入矩阵的行数和列数,空间复杂度为 O(1)。

  1 package algorithm;
2
3 public class ZArrangement {
4
5
6
7 /**
8 * Z字型编排打印矩阵
9 *
10 * @param arr 矩阵
11 * @param n 指定子矩阵的行
12 * @param m 指定子矩阵的列
13 */
14 private static void zigzagMatrix(int[][] arr, int n, int m) {
15 int row = 0, col = 0;
16
17 /* 行增长变量,控制和的布尔型变量*/
18 boolean row_inc = false;
19
20 // 打印上半(包括反对角线)Z字形图案的矩阵
21 int mn = Math.min(m, n);
22 for (int len = 1; len <= mn; ++len) {
23 for (int i = 0; i < len; ++i) {
24 System.out.print(arr[row][col] + " ");
25
26 if (i + 1 == len) {
27 break;
28 }
29
30 // 如果row_increment值为true,增加行并减少列, 否则递减行并递增列
31 if (row_inc) {
32 //
33 ++row;
34 --col;
35 } else {
36 //
37 --row;
38 ++col;
39 }
40 }
41
42 if (len == mn) {
43 break;
44 }
45
46 // 根据最后的增量更新行或列的值
47 if (row_inc) {
48 ++row;
49 row_inc = false;
50 } else {
51 ++col;
52 row_inc = true;
53 }
54 }
55
56
57 // 更新row和col变量的索引
58 if (row == 0) {
59 if (col == m-1)
60 ++row;
61 else
62 ++col;
63 row_inc = true;
64 } else {
65 if (row == n-1)
66 ++col;
67 else
68 ++row;
69 row_inc = false;
70 }
71
72 // 打印剩下的Z字型图案矩阵
73 int MAX = Math.max(m, n) - 1;
74 for (int len, diag = MAX; diag > 0; --diag) {
75 if (diag > mn)
76 len = mn;
77 else
78 len = diag;
79
80 for (int i = 0; i < len; ++i) {
81 System.out.print(arr[row][col] + " ");
82
83 if (i + 1 == len)
84 break;
85
86 // 根据最后的增量更新行或列的值
87 if (row_inc) {
88 ++row;
89 --col;
90 } else {
91 ++col;
92 --row;
93 }
94 }
95
96 // 更新row和col变量的索引
97 if (row == 0 || col == m-1) {
98 if (col == m-1)
99 ++row;
100 else
101 ++col;
102 row_inc = true;
103 }
104
105 else if (col == 0 || row == n-1) {
106 if (row == n-1)
107 ++col;
108 else
109 ++row;
110 row_inc = false;
111 }
112 }
113 }
114
115 public static void main(String[] args) {
116 int[][] matrix = {
117 {1, 2, 3},
118 {4, 5, 6},
119 {7, 8, 9}
120 };
121 zigzagMatrix(matrix, 3, 3);
122 }
123 }

算法:Z字型(Zigzag)编排的更多相关文章

  1. LeetCode OJ:ZigZag Conversion(字符串的Z字型转换)

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  2. LeetCode ZigZag Conversion(将字符串排成z字型)

    class Solution { public: string convert(string s, int nRows) { string a=""; int len=s.leng ...

  3. 281. Zigzag Iterator z字型遍历

    [抄题]: Given two 1d vectors, implement an iterator to return their elements alternately. Example: Inp ...

  4. [LeetCode] Z字型变换

    题目内容: 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:" ...

  5. leetcode 6/300 Z字型变换 py

    目录 题目说明 方法一:利用flag 题目说明 方法一:利用flag 简单来说就是利用flag来表示方向,真的神来之笔. class Solution: def convert(self, s: st ...

  6. 06. Z字型变换

    题目: 提交01: class Solution { public String convert(String s, int numRows) { int length = 2*numRows-2; ...

  7. leetcode 6 z字型变换

    执行用时 :64 ms, 在所有 Python3 提交中击败了99.74%的用户由题目可知 我们的最终字符串会被摆成 numRows 行,那我们理解为 最终结果是numRows个字符串相加 先建立等于 ...

  8. [LeetCode] ZigZag Converesion 之字型转换字符串

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  9. [LeetCode] 6. ZigZag Conversion 之字型转换字符串

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

随机推荐

  1. 2.设计模式常用的UML图分析(用例图、类图与时序图)

    1-用例图 概述 展现了一组用例.参与者以及他们之间的关系. 用例图从用户角度描述系统的静态使用情况,用于建立需求模型. 用例特征 保证用例能够正确捕捉功能性需求,判断用例是否准确的依据. 用例是动宾 ...

  2. 珠峰2016,第9期 vue.js 笔记部份

    在珠峰参加培训好年了,笔记原是记在本子上,现在也经不需要看了,搬家不想带上书和本了,所以把笔记整理下,存在博客中,也顺便复习一下 安装vue.js 因为方便打包和环境依赖,所以建意npm  init  ...

  3. BZOJ_1008 越狱(快速幂)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1008 Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教 ...

  4. 一起学习PHP中GD库的使用(二)

    在日常的开发过程中,GD 库最常用的功能就是帮我们对图片进行一些处理,当然,除了处理已有的图片之外,它也可以直接来画图,就像我们最常见的图片验证码.今天的内容主要就是和画图有关,所以最后我们也会做一个 ...

  5. js 获取转换网址中文参数

    var search = decodeURI(location.search).substr(1); console.log(search); decodeURI 方法返回一个已编码的统一资源标识符 ...

  6. C# 获取动态类中所有的字段

    /// <summary>        /// 动态类 获取字典集合        /// </summary>        /// <typeparam name= ...

  7. javascript 中介者模式 mediator

    * player.js /** * 中介者模式 * @param {*} name 角色名称 * @param {*} teamColor 队伍颜色 */ function Player(name, ...

  8. python多线程与_thread模块

    进程与线程 1.进程:计算机程序只是存储在磁盘中的可执行二进制(或其他类型)的文件.只有把他们加载到内存中并被操作系统调用,才具有其生命周期.进程则是一个执行中的程序.每个进程都拥有自己的地址空间,内 ...

  9. Python生成桌面应用

    1.cd进入project所在根目录 2.pyinstaller -F demo.py --noconsole 3.自定义图标 选择ico格式图标发在project目录 4.pyinstaller - ...

  10. PyTorch中的Batch Normalization

    Pytorch中的BatchNorm的API主要有: 1 torch.nn.BatchNorm1d(num_features, 2 3 eps=1e-05, 4 5 momentum=0.1, 6 7 ...