算法: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 ...
随机推荐
- Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!
前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...
- 删除数组中指定的元素,然后将后面的元素向前移动一位,将最后一位设置为NULL 。 String[] strs={“aaa”,”ccc”,”ddd”,”eee”,”fff”,”ggg”}; 指定删除字符串“ccc”,把后的元素依次向前移动!!!
public static void main(String[] args) { int temp = -1; String[] strs = {"aaa", "ccc& ...
- Java基础系列(38)- 数组的使用
数组的使用 For-Each循环 数组作方法入参 数组作返回值 For-Each循环 普通型 package array; import sun.security.util.Length; publi ...
- no rxtxSerial in java.library.path
java开发过程中,遇到no rxtxSerial in java.library.path问题,是由于缺少一个dll文件导致. 在jre/bin下添加rxtxSerial.dll 文件 win10环 ...
- GIS应用|快速搭建REST地图服务
SuperMap Online云存储作为您的"在线GIS云盘",除了可以在云端存储GIS数据,还可以将数据直接发布多种REST服务,为您节省购买和部署SuperMap iServe ...
- 鸿蒙内核源码分析(线程概念篇) | 是谁在不停的折腾CPU? | 百篇博客分析OpenHarmony源码 | v21.06
百篇博客系列篇.本篇为: v21.xx 鸿蒙内核源码分析(线程概念篇) | 是谁在不断的折腾CPU | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调 ...
- Hive语法及其进阶(一)
1.Hive完整建表 1 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name( 2 [(col_name data_type [COMMENT col ...
- element-ui上传多个文件时会发送多个请求
1. element-ui的默认 默认是异步多次请求上传单个文件 如果业务就是单纯的上传文件,那么这个样子是没有问题的 前端代码参考 https://element-plus.gitee.io/#/z ...
- .Net微服务实战之可观测性
系列文章 .Net微服务实战之技术选型篇 .Net微服务实战之技术架构分层篇 .Net微服务实战之DevOps篇 .Net微服务实战之负载均衡(上) .Net微服务实战之CI/CD .Net微服务实战 ...
- 巧用优先队列:重载运算符在STL优先队列中的应用
前言 写优先队列优化dijkstra的时候,需要放进优先队列的常常有数值和编号两类,以下介绍让编号捆绑数值放入优先队列的几种方法. 由于过程比较简单,记住代码即可,下面不再讲解,只附上代码,请读者自行 ...