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

书籍转圈打印矩阵(8)0604

题目
给定一个整型矩阵matrix,请按照转圈的方式打印它。

例如:

1        2        3        4

5        6        7        8

9        10     11      12

13      14     15      16

打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10

额外空间复杂度为O(1)

解答

这道题可以使用矩阵分圈处理法,这个方法适用与所有矩阵处理。

在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵,比如,题目中的矩阵,当(tR,tC)=(0,0)、(dR,dC)=(3,3),表示的子矩阵就是整个矩阵,那么这个子矩阵最外层的部分如下:

1        2        3        4

5                            8

9                           12 

13     14      15      16

如果能把这个子矩阵的外层转圈打印出来,那么在(tR,tC)=(0,0)、(dR,dC)=(3,3)时,打印的结果为:1,2,3,4,8,12,16,15,14,13,9,5。接下来令tR和tC加1,即(tR,tC)=(1,1),令dR和dC减1,(dR,dC)=(2,2),此时表示的子矩阵如下:

6        7

10     11

再把这个子矩阵转圈打印出来,结果为:6,7,11,10。把tR和tC加1,即(tR,tC)=(2,2),令dR和dC减1,即(dR,dC)=(1,1)。如果发现左上角坐标跑到了右下角坐标的右方或下方,整个过程就停止。已经打印的所有结果来连起来就是我们要求的打印结果。

public void spiralOrderPrint(int[][] matrix){int tR = 0;int tC = 0;int dR = matrix.length - 1 ;int dC = matrix[0].length - 1;while(tR < dR && tC <= dC ){printEdge(matrix,tR++,tC++,dR--,dC--);}
}public void printEdge(int[][] m,int tR,int tC,int dR,int dC){if(tR == dR){//子矩阵只有一行时for(int i = tC;i<=dC;i++){System.out.print(m[tR][i]+ " " );}}else if(tC == dC){//子矩阵只有一列时for(int i = tR; i<= dR;i++){System.out.print(m[i][tC] + " ");}}else{//一般情况int curC = tC;int curR = tR;while(curC != dC){System.out.print(m[tR][curC] + " ");curC++;}while(curR != dR){System.out.print(m[curR][dC] + " ");curR++;}while(curC != tC){System.out.print(m[dR][curC] + " ");curC--;}while(curR != tR){System.out.print(m[curR][tC] + " ");curR--;}}
}

http://www.lryc.cn/news/2401239.html

相关文章:

  • 【JVM】Java类加载机制
  • Elasticsearch中的自定义分析器(Custom Analyzer)介绍
  • 《C++初阶之入门基础》【C++的前世今生】
  • Apache APISIX
  • 如何在 git dev 中创建合并请求
  • 基于nlohmann/json 实现 从C++对象转换成JSON数据格式
  • Java枚举类映射MySQL的深度解析与实践指南
  • 代码训练LeetCode(21)跳跃游戏2
  • 【HarmonyOS 5】鸿蒙APP使用【团结引擎Unity】开发的案例教程
  • 《T/CI 404-2024 医疗大数据智能采集及管理技术规范》全面解读与实施分析
  • 国产三维CAD皇冠CAD在「金属压力容器制造」建模教程:蒸汽锅炉
  • Mysql避免索引失效
  • python爬虫:Ruia的详细使用(一个基于asyncio和aiohttp的异步爬虫框架)
  • C++中单例模式详解
  • 舆情监控系统爬虫技术解析
  • Windows上用FFmpeg采集摄像头推流 → MediaMTX服务器转发流 → WSL2上拉流播放
  • cpp多线程学习
  • Vue3中Ant-design-vue的使用-附完整代码
  • k8s热更新-subPath 不支持热更新
  • Redis Sorted Set 深度解析:从原理到实战应用
  • docker中组合这几个命令来排查 import 模块失败 的问题
  • 若依框架修改模板,添加通过excel导入数据功能
  • web全栈开发学习-01html基础
  • 基于Socketserver+ThreadPoolExecutor+Thread构造的TCP网络实时通信程序
  • [Java 基础]枚举
  • 多线程环境中,如果多个线程同时尝试向同一个TCP客户端发送数据,添加同步机制
  • 【含文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现
  • 贝叶斯优化+LSTM+时序预测=Nature子刊!
  • NodeJS全栈WEB3面试题——P3Web3.js / Ethers.js 使用
  • Quick UI 组件加载到 Axure