算法:Z字型(Zigzag)编排
问题:给定 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)编排的更多相关文章
- LeetCode OJ:ZigZag Conversion(字符串的Z字型转换)
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- LeetCode ZigZag Conversion(将字符串排成z字型)
class Solution { public: string convert(string s, int nRows) { string a=""; int len=s.leng ...
- 281. Zigzag Iterator z字型遍历
[抄题]: Given two 1d vectors, implement an iterator to return their elements alternately. Example: Inp ...
- [LeetCode] Z字型变换
题目内容: 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:" ...
- leetcode 6/300 Z字型变换 py
目录 题目说明 方法一:利用flag 题目说明 方法一:利用flag 简单来说就是利用flag来表示方向,真的神来之笔. class Solution: def convert(self, s: st ...
- 06. Z字型变换
题目: 提交01: class Solution { public String convert(String s, int numRows) { int length = 2*numRows-2; ...
- leetcode 6 z字型变换
执行用时 :64 ms, 在所有 Python3 提交中击败了99.74%的用户由题目可知 我们的最终字符串会被摆成 numRows 行,那我们理解为 最终结果是numRows个字符串相加 先建立等于 ...
- [LeetCode] ZigZag Converesion 之字型转换字符串
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- [LeetCode] 6. ZigZag Conversion 之字型转换字符串
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
随机推荐
- systemctl --now参数
1.我们安装一个httpd服务来测试一下 --now参数 yum install httpd 2.查看一下当前服务状态 可以看到服务没有启动 而且服务没有自启 [root@master1 ~]# s ...
- TS基础笔记
TS优势 更好的错误的提示,开发中及时发现问题:编辑器语法提示更完善:类型声明可以看出数据结构的语义,可读性更好; TS环境搭建 1.安装node;2.npm install typescript@3 ...
- PHP的CLI命令行运行模式浅析
在做开发的时候,我们不仅仅只是做各种网站或者接口,也经常需要写一些命令行脚本用来处理一些后端的事务.比如对数据进行处理统计等.当然也是为了效率着想,当一个事务有可能会有较长的耗时时,往往会交由服务器的 ...
- Mysql实现排序
排序 SELECT obj.user_id,obj.score,@rownum := @rownum + 1 AS rownum FROM ( SELECT ...
- linux 修改文件名称的三中方法
一:rename "old.html" "oldd.HTML" *html参数.有什么.改为什么 ,目标文件: 二 : #!/bin/sh Dirname=&q ...
- SVN基本配置--创建版本库(图文并茂)
SVN基本配置简 上一篇介绍了VisualSVN Server和TortoiseSVN的下载,安装,汉化.这篇介绍一下如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使 ...
- Python3入门系列之-----列表
列表 列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. ...
- ASP.NET Core 5.0 中读取Request中Body信息
ASP.NET Core 5.0 中读取Request中Body信息 记录一下如何读取Request中Body信息 public class ValuesController : Controller ...
- 4-让线程睡眠的sleep方法
让线程睡眠的sleep方法 Thread类有一个静态的sleep方法,当一个执行中的线程调用了Thread的sleep方法,调用线程就会让出指定时间的执行权,也就是在这期间不参与CPU调度,但是该线程 ...
- Spark MLib完整基础入门教程
Spark MLib 在Spark下进行机器学习,必然无法离开其提供的MLlib框架,所以接下来我们将以本框架为基础进行实际的讲解.首先我们需要了解其中最基本的结构类型,即转换器.估计器.评估器和流水 ...