当前位置: 首页 > news >正文

左神算法之Zigzag方式打印矩阵

目录

  • Zigzag方式打印矩阵
    • 1. 题目
    • 2. 解释
    • 3. 思路
    • 4. 代码
    • 5. 总结

Zigzag方式打印矩阵

1. 题目

用zigzag的方式打印矩阵,比如下面的矩阵:

0 1 2 3
4 5 6 7 
8 9 10 11

打印顺序为:0 1 4 8 5 2 3 6 9 10 7 11

2. 解释

Zigzag打印矩阵是指按照对角线交替方向打印矩阵元素。具体来说:

  1. 从左上角(0,0)开始,向右移动
  2. 当到达第一行末尾时,向下移动
  3. 然后按照左下到右上的方向打印对角线
  4. 接着按照右上到左下的方向打印对角线
  5. 如此交替,直到打印完所有元素

对于示例矩阵,打印顺序如下:

  • 向右:0
  • 向右:1
  • 左下到右上:4→1 (但1已打印),实际是4
  • 右下到左下:8→5→2
  • 右上到左下:3 (已到达右边界,向下)
  • 左下到右上:6→9
  • 右上到左下:10→7
  • 左下到右上:11

3. 思路

我们可以使用两个变量来追踪当前打印的对角线的起点,并交替改变打印方向:

  1. 初始化两个点A和B,都从(0,0)开始
  2. A点先向右移动,到达右边界后向下移动
  3. B点先向下移动,到达下边界后向右移动
  4. 每次A和B确定一条对角线,交替方向打印这条对角线上的元素
  5. 直到A和B都到达矩阵右下角结束

4. 代码

public class ZigzagPrintMatrix {public static void printMatrixZigzag(int[][] matrix) {if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return;}int aR = 0, aC = 0;  // A点的行和列int bR = 0, bC = 0;   // B点的行和列int endR = matrix.length - 1;int endC = matrix[0].length - 1;boolean fromUp = false; // 打印方向标志,false表示从下往上while (aR != endR + 1) {printDiagonal(matrix, aR, aC, bR, bC, fromUp);// 更新A点:先向右,到达右边界后向下aR = aC == endC ? aR + 1 : aR;aC = aC == endC ? aC : aC + 1;// 更新B点:先向下,到达下边界后向右bC = bR == endR ? bC + 1 : bC;bR = bR == endR ? bR : bR + 1;fromUp = !fromUp; // 切换打印方向}System.out.println();}private static void printDiagonal(int[][] matrix, int aR, int aC, int bR, int bC, boolean fromUp) {if (fromUp) {// 从右上到左下打印while (aR <= bR) {System.out.print(matrix[aR++][aC--] + " ");}} else {// 从左下到右上打印while (bR >= aR) {System.out.print(matrix[bR--][bC++] + " ");}}}public static void main(String[] args) {int[][] matrix = {{0, 1, 2, 3},{4, 5, 6, 7},{8, 9, 10, 11}};printMatrixZigzag(matrix); // 输出: 0 1 4 8 5 2 3 6 9 10 7 11 }
}

5. 总结

Zigzag打印矩阵的关键在于:

  1. 确定两个移动点A和B的移动规律
  2. 交替改变对角线的打印方向
  3. 正确处理边界条件

这种方法的时间复杂度是O(M×N),其中M和N分别是矩阵的行数和列数,因为我们只访问每个元素一次。空间复杂度是O(1),只使用了常数个额外变量。

这种打印方式在实际应用中可能用于特殊的数据展示需求,或者作为某些图像处理算法的预处理步骤。理解这种遍历方式有助于加深对矩阵操作的理解。


文章转载自:
http://calculational.bdypl.cn
http://bicho.bdypl.cn
http://cassaba.bdypl.cn
http://aerogenically.bdypl.cn
http://caliduct.bdypl.cn
http://chloralose.bdypl.cn
http://bushwhack.bdypl.cn
http://agrotechny.bdypl.cn
http://aback.bdypl.cn
http://bacca.bdypl.cn
http://breast.bdypl.cn
http://anger.bdypl.cn
http://chloritize.bdypl.cn
http://butterfish.bdypl.cn
http://ascendant.bdypl.cn
http://carcel.bdypl.cn
http://autoff.bdypl.cn
http://auricle.bdypl.cn
http://catenative.bdypl.cn
http://bahadur.bdypl.cn
http://channelize.bdypl.cn
http://belladonna.bdypl.cn
http://anastomosis.bdypl.cn
http://absonant.bdypl.cn
http://catalyzer.bdypl.cn
http://beatlemania.bdypl.cn
http://acetaldehydase.bdypl.cn
http://bacterioscopy.bdypl.cn
http://avocat.bdypl.cn
http://bedrail.bdypl.cn
http://www.dtcms.com/a/262191.html

相关文章:

  • Redis分布式锁核心原理源码
  • SpringCloud系列(40)--SpringCloud Gateway的Filter的简介及使用
  • 和ai对话:讨论一个简单的理财方案
  • Halcon 常用算子总结
  • 基于 SpringBoot 实现一个 JAVA 代理 HTTP / WS
  • MyBatis实战指南(八)MyBatis日志
  • 热传导方程能量分析与边界条件研究
  • HarmonyOS实战:自定义表情键盘
  • < OS 有关 4 台 Ubuntu VPSs 正在被攻击:nginx 之三> 记录、分析、防护的过程 配置 ufw Fail2Ban 保护网络上的主机
  • 个人计算机系统安全、网络安全、数字加密与认证
  • Github 2025-06-29php开源项目日报 Top10
  • RK3588集群服务器性能优化案例:电网巡检集群、云手机集群、工业质检集群
  • Mac电脑手动安装原版Stable Diffusion,开启本地API调用生成图片
  • 基于云的平板挠度模拟:动画与建模-AI云计算数值分析和代码验证
  • Linux中部署Nacos保姆级教程
  • Wpf布局之WrapPanel面板!
  • Java面试宝典:基础二
  • JSON + 存储过程:SaaS 架构下的统一接口与租户定制之道
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 19(题目+回答)
  • OpenCV读取照片和可视化详解和代码示例
  • Java 数据结构 泛型
  • Hive SQL 快速入门指南
  • 线性相关和线性无关
  • 【记录】服务器多用户共享Conda环境——Ubuntu24.04
  • HarmonyOS NEXT仓颉开发语言实战案例:健身App
  • HarmonyOS NEXT仓颉开发语言实战案例:小而美的旅行App
  • GO 语言学习 之 数组和切片
  • 无人机用shell远程登录机载电脑,每次需要环境配置原因
  • 现代 JavaScript (ES6+) 入门到实战(六):异步的终极形态 - async/await 的优雅魔法
  • Redis分布式锁深度解析:从原理到实践