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

Leetcode力扣解题记录--第54题(矩阵螺旋)

题目链接:54. 螺旋矩阵 - 力扣(LeetCode)

题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  • m == matrix.length

  • n == matrix[i].length

  • 1 <= m, n <= 10

  • -100 <= matrix[i][j] <= 100

题目作答

解决这个问题的核心思想是按层模拟。我们可以把矩阵想象成一个洋葱,从最外层开始,一层一层地向内“剥”,依次读取每一层的元素。

为了实现这一点,我们使用四个变量来定义当前遍历层的边界:

  • top:指向当前层的最顶行的行号。

  • bottom:指向当前层的最底行的行号。

  • left:指向当前层的最左列的列号。

  • right:指向当前层的最右列的列号。

整个遍历过程在一个循环中进行,循环的条件是 left <= right 并且 top <= bottom,这确保了边界内部仍然有元素可以遍历。在每一轮循环中,我们按顺时针顺序走完当前层的一圈:

  1. 从左到右:遍历上边界(top行),从 left 列到 right 列,将元素加入结果列表。完成之后,top 行已经被遍历完毕,所以我们将 top 加一,收缩上边界。

  2. 从上到下:遍历右边界(right列),从新的 top 行到 bottom 行。完成之后,right 列也被遍历完毕,所以我们将 right 减一,收缩右边界。

  3. 从右到左:遍历下边界(bottom行),从新的 right 列到 left 列。完成之后,bottom 行也处理完毕,所以 bottom 减一,收缩下边界。

  4. 从下到上:遍历左边界(left列),从新的 bottom 行到 top 行。完成之后,left 列也处理完毕,所以 left 加一,收缩左边界。

这个过程会不断重复,边界不断向内收缩,直到它们交错(left > right 或 top > bottom),此时所有元素都已被遍历。需要注意的是,在第3步和第4步执行前,要检查边界是否依然有效,以防止在处理只有一行或一列的矩阵时重复添加元素。

 

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {if (matrix.empty() || matrix[0].empty()) {return {};}int m = matrix.size();int n = matrix[0].size();vector<int> result;// 定义四个边界int top = 0, bottom = m - 1, left = 0, right = n - 1;while (left <= right && top <= bottom) {// 1. 从左到右遍历上边界for (int j = left; j <= right; ++j) {result.push_back(matrix[top][j]);}top++; // 收缩上边界// 2. 从上到下遍历右边界for (int i = top; i <= bottom; ++i) {result.push_back(matrix[i][right]);}right--; // 收缩右边界// 检查边界是否依然有效,防止重复if (top <= bottom) {// 3. 从右到左遍历下边界for (int j = right; j >= left; --j) {result.push_back(matrix[bottom][j]);}bottom--; // 收缩下边界}// 检查边界是否依然有效,防止重复if (left <= right) {// 4. 从下到上遍历左边界for (int i = bottom; i >= top; --i) {result.push_back(matrix[i][left]);}left++; // 收缩左边界}}return result;}
};

 

http://www.dtcms.com/a/294814.html

相关文章:

  • 表征工程中哪里用到内积 :内积vs余弦相似度--谁更胜一筹?
  • 智慧农业平台-农资农服农业数字化转型
  • 算法第三十七天:动态规划part05(第九章)
  • Golang各版本特性
  • 算法:数组part01:704. 二分查找 +977.有序数组的平方
  • ZeroMQ源码深度解析:高性能网络库的架构设计与性能优化
  • 高效编程革命:DeepSeek V3多语言支持与性能优化实战
  • 【前端】当前主流的 CSS 预处理器语言Sass / SCSS、Less、Stylus
  • C++:list(1)list的使用
  • HomeAssistant本地开发笔记
  • 「iOS」——KVO
  • MCP客户端架构与实施
  • SQL基础⑦ | 子查询
  • Linux——System V 共享内存 IPC
  • 【第十二章 W55MH32 NetBIOS示例标题】
  • ChatGPT桌面版深度解析
  • clientHeight(用于获取元素的可视高度)
  • 大致自定义文件I/O库函数的实现详解(了解即可)
  • 计算机网络学习----域名解析
  • uni-app平板端自定义样式合集
  • 【67】MFC入门到精通——MFC 销售管理系统 项目实现详细教程
  • 【自动化运维神器Ansible】深入解析Ansible Host-Pattern:精准控制目标主机的艺术
  • PowerShell自动化核对AD与HR系统账户信息实战指南
  • Hexo - 免费搭建个人博客02 - 创建个人博客
  • 智能办公如何创建e9流程
  • 力扣刷题(第九十六天)
  • Windows 用 Python3 快速搭建 HTTP 服务器
  • Google Chrome V8< 14.0.221 类型混淆漏洞
  • 基于Kafka实现动态监听topic功能
  • 元图CAD:高效分割图纸的智能解决方案