当前位置: 首页 > 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.lryc.cn/news/597204.html

相关文章:

  • 算法:数组part01:704. 二分查找 +977.有序数组的平方
  • Java开发岗面试记录合集
  • LLM 中的 温度怎么控制随机性的?
  • AI驱动攻防升级,API安全走到关键档口
  • CentOS 7 Linux 用 yum 安装 Docker,含 Docker 镜像无法拉取问题(即 docker pull 失败)的解决方案
  • 路由器与交换机的区别
  • 数据结构之队列(C语言)
  • 【优选算法-多源 BFS】多源 BFS:解决多个起点的广度优先搜索
  • 【大模型文生图、文生音频实战Demo】基于Spring AI Alibaba和阿里百炼大模型实现文生图、文生视频
  • Android MediaCodec 的使用和源码实现分析
  • 2.1 为什么定义tensor数据结构?
  • 【有趣的跳跃一维数组问题】2022-7-27
  • 彻底掌握双列集合——Map接口以及实现类和常用API及其底层原理
  • 题解:P9468 [EGOI 2023] Candy / 糖果
  • 亚马逊云科技 上海AI研究院 突然解散 | AI早报
  • Taint Bug (污点漏洞):
  • GitHub 趋势日报 (2025年07月22日)
  • Docker 基础概念
  • 解决Node 17+版本与Metro、Webpack等兼容性问题(500)
  • 数据结构自学Day13 -- 快速排序--“分而治之”
  • ITIL 4:云计算与微服务对组织架构的影响
  • kotlin基础【1】
  • android studio(NewsApiDemo)100%kotlin
  • 【前端】当前主流的 CSS 预处理器语言Sass / SCSS、Less、Stylus
  • kotlin基础【2】
  • BaaS平台(Supabase)
  • 数据结构自学Day13 -- 快速排序--“前后指针法”
  • 《计算机网络》实验报告六 电子邮件
  • 数据结构(2)顺序表算法题
  • 【数据结构】二叉树的链式结构--用C语言实现