算法: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 ...
随机推荐
- weblogic漏洞分析之CVE-2017-10271
weblogic漏洞分析之CVE-2017-10271 一.环境搭建 1)配置docker 这里使用vulhub的环境:CVE-2017-10271 编辑docker-compose.yml文件,加入 ...
- 在excel中,应用公式到多行
当一个单元格中输入公式后, 选中单元格 然后将鼠标放到右下角的控制手柄处,当鼠标变成"黑十字"标志 双击鼠标左键 即可
- jmeter之图形结果
jmeter监听器中的图形报表如何分析,反正第一次看到图时,不觉明厉害. 样本数目:是总共发送到服务器的请求数. 最新样本:是代表时间的数字,是服务器响应最后一个请求的时间. 吞吐量:是服务器每分钟处 ...
- jmeter之命令行执行jmx脚本
使用界面执行不稳定,且保存报告非常麻烦 https://www.jb51.net/article/191367.htm 作者:Anthony_tester 来源:CSDN 原文:https://blo ...
- 牛客挑战赛48C-铬合金之声【Prufer序列】
正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/C 题目大意 \(n\)个点加\(m\)条边使得不存在环,每种方案的权值是所有联通块的大小乘积. 求 ...
- 《集体智慧编程学习笔记》——Chapter2:提供推荐
知识点: 1. 协作型过滤--Collaboraive Filtering 通常的做法是对一群人进行搜索,并从中找出与我们品味相近的一小群人,算法会对这些人的偏好进行考察,并将它们组合起来构造出一个经 ...
- Markdown 相关语法
MD语法博客:https://www.cnblogs.com/Jetictors/p/8506757.html 公式 \[\mathbf{x}_{t}=\Phi_{t}\left(\mathbf{x} ...
- PyTorch中的Batch Normalization
Pytorch中的BatchNorm的API主要有: 1 torch.nn.BatchNorm1d(num_features, 2 3 eps=1e-05, 4 5 momentum=0.1, 6 7 ...
- Java秘诀!Java逻辑运算符介绍
运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的. Java 语言中的运算符除了具有优先级之外,还有结合性的特点.当一个表达式中出现多种运算符时,执行的先后顺序 ...
- dubbo-admin的使用
目录 了解 dubbo-admin 下载 dubbo-admin 使用 dubbo-admin 1.dubbo-admin是什么 dubbo-admin是一个监控程序,可以通过web很方便的管理监控众 ...