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

转圈打印矩阵

转圈打印矩阵

【题目】

给定一个整型矩阵 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)。如果发现左上角坐标跑到了右下角坐标的右方或下方,整个 过程就停止。已经打印的所有结果连起来就是我们要求的打印结果。具体请参看如下代码中的 spiralOrderPrint 方法,其中 printEdge 方法是转圈打印一个子矩阵的外层。


public class Solution {int length=0;public int[] spiralOrder(int[][] matrix) {if(matrix.length==0){return new int[0];}int tR=0;int tC=0;int dR= matrix.length-1;int dC=matrix[0].length-1;int[] arr=new int[matrix.length*matrix[0].length];while(tR<=dR && tC<=dC){printMatric(matrix,arr,tR++,tC++,dR--,dC--);}return arr;}private void printMatric(int[][] matrix, int[] arr, int tR, int tC, int dR, int dC) {if(tR==dR){while (tC<=dC){arr[length++]=matrix[tR][tC++];}}else if(tC==dC){while(tR<=dR){arr[length++]=matrix[tR++][tC];}}else {int curc=tC;int curR=tR;while (curc<dC){arr[length++]=matrix[tR][curc++];}while(curR<dR){arr[length++]=matrix[curR++][curc];}while (curc>tC){arr[length++]=matrix[dR][curc--];}while(curR>tR){arr[length++]=matrix[curR--][tC];}}}}
http://www.lryc.cn/news/118470.html

相关文章:

  • Elasticsearch 与 OpenSearch:揭开性能差距
  • 100个Java工具类之41:系统工具类Apache之SystemUtils
  • maven Jar包反向install到本地仓库
  • .NET6使用SqlSugar操作数据库
  • MySQL8是什么-MySQL8知识详解
  • Spring Gateway+Security+OAuth2+RBAC 实现SSO统一认证平台
  • flutter开发实战-TextPainter计算文本内容的宽度
  • 竞赛项目 深度学习的动物识别
  • MySQL相关的SQL语句、数据库、数据表、字段、类型
  • 微信个人小程序申请 (AppID 和 AppSecret)
  • 使用zap日志替代xorm日志
  • YOLOv5-7.0实例分割+TensorRT部署
  • 回归决策树模拟sin函数
  • NeRF基础代码解析
  • 职场新星:Java面试干货让你笑傲求职路(三)
  • 获取指定收获地址的信息
  • 突破笔试:力扣全排列(medium)
  • gitlab 503 错误的解决方案
  • 智能离子风棒联网监控静电消除器的主要功能和特点
  • matplotlib 设置legend的位置在轴最上方,长度与图的长度相同
  • Docker-Compose 安装rabbitmq
  • leetcode357- 2812. 找出最安全路径
  • Oracle连接数据库提示 ORA-12638:身份证明检索失败
  • 在 Linux 中使用 systemd 注册服务
  • (03)Unity HTC VRTK 基于 URP 开发记录
  • .bit域名调研
  • Vue数组变更方法和替换方法
  • Centos-6.3安装使用MongoDB
  • Mysql 复杂查询丨联表查询
  • C语言进阶第二课-----------指针的进阶----------升级版