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

剑指offer26_顺时针打印矩阵

顺时针打印矩阵


输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

数据范围

矩阵中元素数量 [ 0 , 400 ] [0,400] [0,400]

样例
输入:
[[1, 2, 3, 4],[5, 6, 7, 8],[9,10,11,12]
]输出:[1,2,3,4,8,12,11,10,9,5,6,7]
算法思路
  1. 初始化
    • 检查输入矩阵是否为空,若为空则直接返回空结果。
    • 获取矩阵的行数 n 和列数 m
    • 创建一个与矩阵大小相同的二维布尔数组 st,用于标记已经访问过的元素。
    • 定义四个方向的位移数组 dxdy,分别表示上、右、下、左四个方向的移动。
    • 初始化当前位置 (x, y)(0, 0),初始方向 d 为 1(向右)。
  2. 遍历矩阵
    • 循环 n * m 次,每次将当前元素加入结果数组,并标记为已访问。
    • 计算下一个位置的坐标 (a, b)
    • 如果下一个位置超出矩阵边界或已经被访问过,则改变方向(顺时针旋转 90 度)。
    • 更新当前位置 (x, y) 为下一个合法位置。
  3. 返回结果
    • 最终返回存储了螺旋顺序遍历结果的数组。
  • 时间复杂度O(n * m),其中 n 是矩阵的行数,m 是矩阵的列数。算法需要遍历矩阵中的每一个元素一次。
  • 空间复杂度O(n * m),用于存储访问标记的二维数组 st。如果忽略输出结果的空间,额外空间复杂度为 O(n * m)
class Solution {
public:vector<int> printMatrix(vector<vector<int> > matrix) {vector<int> res;if(matrix.empty()) return res;int n = matrix.size(), m = matrix[0].size();vector<vector<bool>> st(n, vector<bool>(m));int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};int x = 0, y = 0, d = 1;for(int k = 0; k < n * m; k ++){res.push_back(matrix[x][y]);st[x][y] = true;int a = x + dx[d], b = y + dy[d];if(a < 0 || a >= n || b < 0 || b >= m || st[a][b]){d = (d + 1) % 4;a = x + dx[d], b = y + dy[d];}x = a, y = b;}return res;}
};

相关文章:

  • 产品经理页面布局设计的四维思考框架
  • 低秩分解的本质是通过基矩阵和系数矩阵的线性组合,以最小的存储和计算代价近似表示复杂矩阵
  • 如何高效的学习算法与数据结构
  • 408第一季 - 数据结构 - 散列表
  • 【数据结构中的堆】
  • 理解ES6中的Promise
  • Linux服务器运维常用命令大全
  • 不同conda 不同cuda版本方法
  • /etc/profile.d/conda.sh: No such file or directory : numeric argument required
  • Python基础教学:航天工程领域的精确计算和金融领域的精确计算,分别采用的小数保留位数的方法有哪些?有什么区别?-由Deepseek产生
  • Oracle03-PL/SQL Developer
  • Vue学习001-创建 Vue 应用
  • 循环神经网络及其变体
  • Python+QT远程控制助手-ver2
  • Dify 插件工具:远程连接配置指南
  • NY271NY274美光科技固态NY278NY284
  • 车载通信架构 --- IP ECU 在连接被拒绝后的重连机制
  • C++第一阶段——语言基础与核心特性
  • 项目 : 基于正倒排的boost搜索引擎
  • AI for Science:智能科技如何重塑科学研究
  • wordpress安装网站吗/域名注册 万网
  • dz论坛网站建设/怎样创建自己的电商平台
  • 做影视网站需要境外/百度拍照搜题
  • 如何通过网络营销自己/抖音seo怎么做的
  • 北京网站建设询q479185700上快/长沙关键词优化公司电话
  • 自己电脑做采集网站/搜索引擎营销包括