leetcode 面试经典 150 题:螺旋矩阵

链接螺旋矩阵
题序号54
题型二维数组(矩阵)
解题方法模拟路径法
难度中等
熟练度✅✅✅

题目

给你一个 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

题解

  1. 核心要点:解该题的关键在于维护四个边界变量,并在每遍历完一层后更新这些边界。通过这种方式,我们可以确保按照螺旋顺序遍历矩阵中的所有元素。
    • 初始化边界
      top 和 bottom 分别初始化为矩阵的第一行和最后一行的索引。
      left 和 right 分别初始化为矩阵的第一列和最后一列的索引。
    • 循环条件
      当 top 小于等于 bottom 且 left 小于等于 right 时,继续循环。这个条件确保了我们不会在矩阵遍历完成后继续执行。
    • 遍历顶部行
      从 left 到 right 遍历 top 行,将元素添加到结果列表中。
      遍历完成后,将 top 索引加1,因为顶部行已经遍历完成。
    • 遍历右侧列
      从 top 到 bottom 遍历 right 列,将元素添加到结果列表中。
      遍历完成后,将 right 索引减1,因为右侧列已经遍历完成。
    • 检查是否需要继续遍历
      如果 top 小于等于 bottom,则说明还有底部行需要遍历。
      从 right 到 left 遍历 bottom 行,将元素添加到结果列表中。
      遍历完成后,将 bottom 索引减1。
    • 遍历左侧列
      如果 left 小于等于 right,则说明还有左侧列需要遍历。
      从 bottom 到 top 遍历 left 列,将元素添加到结果列表中。
      遍历完成后,将 left 索引加1。
    • 返回结果
      所有元素遍历完成后,返回结果列表。
  2. 时间复杂度:O(mn)
  3. 空间复杂度:O(1)
  4. c++ 实现算法
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> result;if (matrix.empty()) return result;int top = 0, bottom = matrix.size() - 1;int left = 0, right = matrix[0].size() - 1;while (top <= bottom && left <= right) {// 从左到右沿着最上面一行遍历for (int i = left; i <= right; ++i) {result.push_back(matrix[top][i]);}top++;  // 将顶部边界向下移动// 从上到下沿着最右列遍历。for (int i = top; i <= bottom; ++i) {result.push_back(matrix[i][right]);}right--;  //将右边界向左移动if (top <= bottom) {//从右向左沿着底部一行遍历for (int i = right; i >= left; --i) {result.push_back(matrix[bottom][i]);}bottom--;  //将底部边界向上移动}if (left <= right) {//从底向上沿着最左列遍历for (int i = bottom; i >= top; --i) {result.push_back(matrix[i][left]);}left++;  //将左边界向右移动}}return result;}
};
  1. 演示
/*
假设输入矩阵为:[ [ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]
]初始状态:
top = 0, bottom = 2, left = 0, right = 2
result = [](最终结果)第一步:从左到右遍历上边界
我们首先遍历矩阵的上边界,从左到右:
遍历 matrix[0][0] = 1, matrix[0][1] = 2, matrix[0][2] = 3,把它们添加到 result 中。
更新 result:[1, 2, 3]
增加 top,使 top = 1。
当前状态:
result = [1, 2, 3]
top = 1, bottom = 2, left = 0, right = 2第二步:从上到下遍历右边界
接下来遍历右边界,从上到下:
遍历 matrix[1][2] = 6,matrix[2][2] = 9,把它们添加到 result 中。
更新 result:[1, 2, 3, 6, 9]
减少 right,使 right = 1。
当前状态:
result = [1, 2, 3, 6, 9]
top = 1, bottom = 2, left = 0, right = 1第三步:从右到左遍历下边界
接下来遍历下边界,从右到左:
遍历 matrix[2][1] = 8, matrix[2][0] = 7,把它们添加到 result 中。
更新 result:[1, 2, 3, 6, 9, 8, 7]
减少 bottom,使 bottom = 1。
当前状态:
result = [1, 2, 3, 6, 9, 8, 7]
top = 1, bottom = 1, left = 0, right = 1第四步:从下到上遍历左边界
接下来遍历左边界,从下到上:
遍历 matrix[1][0] = 4,把它添加到 result 中。
更新 result:[1, 2, 3, 6, 9, 8, 7, 4]
增加 left,使 left = 1。
当前状态:
result = [1, 2, 3, 6, 9, 8, 7, 4]
top = 1, bottom = 1, left = 1, right = 1第五步:从左到右遍历上边界(再次)
接下来遍历上边界,从左到右(当前上边界就是 matrix[1][1]):
遍历 matrix[1][1] = 5,把它添加到 result 中。
更新 result:[1, 2, 3, 6, 9, 8, 7, 4, 5]
增加 top,使 top = 2。
当前状态:
result = [1, 2, 3, 6, 9, 8, 7, 4, 5]
top = 2, bottom = 1, left = 1, right = 1终止条件
此时 top > bottom,left > right,我们退出循环。
最终结果为:
[1, 2, 3, 6, 9, 8, 7, 4, 5]*/
  1. c++ 完整demo
#include <vector>
#include <iostream>
using namespace std;class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> result;if (matrix.empty()) return result;int top = 0, bottom = matrix.size() - 1;int left = 0, right = matrix[0].size() - 1;while (top <= bottom && left <= right) {// 从左到右沿着最上面一行遍历for (int i = left; i <= right; ++i) {result.push_back(matrix[top][i]);}top++;  // 将顶部边界向下移动// 从上到下沿着最右列遍历。for (int i = top; i <= bottom; ++i) {result.push_back(matrix[i][right]);}right--;  //将右边界向左移动if (top <= bottom) {//从右向左沿着底部一行遍历for (int i = right; i >= left; --i) {result.push_back(matrix[bottom][i]);}bottom--;  //将底部边界向上移动}if (left <= right) {//从底向上沿着最左列遍历for (int i = bottom; i >= top; --i) {result.push_back(matrix[i][left]);}left++;  //将左边界向右移动}}return result;}
};int main() {Solution solution;vector<vector<int>> matrix = {{ 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 }};vector<int> result = solution.spiralOrder(matrix);// 输出结果for (int num : result) {cout << num << " ";}cout << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保护模式基本概念

CPU 架构 RISC&#xff08;Reduced Instruction Set Computer&#xff09; 中文即"精简指令集计算机”。RISC构架的指令格式和长度通常是固定的&#xff08;如ARM是32位的指令&#xff09;、且指令和寻址方式少而简单、大多数指令在一个周期内就可以执行完毕 CISC&…

突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除

GitLab停止为中国大陆、香港和澳门地区提供服务&#xff0c;要求用户在60天内迁移账号&#xff0c;否则将被删除。这一事件即将引起广泛的关注和讨论。以下是对该事件的扩展信息&#xff1a; 1. 背景介绍&#xff1a;GitLab是一家全球知名的软件开发平台&#xff0c;提供代码托…

git Force Push失败:unable to access解决方案

git Force Push失败&#xff1a;unable to access 项目场景&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;1、访问github远程仓库&#xff0c;更新推送规则1、打开代码库&#xff0c;点击settings2、在settings中下翻&#xff0c;在Danger Zone中将点击Disable…

工业相机镜头选型知识详解

工业相机在机器视觉、自动化生产和检测等领域扮演着重要角色&#xff0c;而镜头作为工业相机的关键组件&#xff0c;其选型直接影响到成像效果和系统的整体性能。在本篇博客中&#xff0c;我们将详细讲解工业相机镜头选型的相关知识&#xff0c;帮助您在实际应用中选择最合适的…

安装CPU版的torch(清华源)

1、安装指令&#xff1a; pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2、验证torch是否安装成功 // 使用python验证 import torch print(torch.__version__)能正常打印版本即表示安装成功&#xff0c;如下图

‘pnpm’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

‘pnpm’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 1.情况: npm -v 和 node -v的都正常就是 pnpm-v 无效 检查环境变量也没看出问题 2.分析 没有正确添加环境变量 3.解决 找到npm的全局安装目录 npm list -g --depth 0这里出现了npm的全局安装…

Java 日志类库

Java 日志库是最能体现 Java 库在进化中的渊源关系的&#xff0c;在理解时重点理解日志框架本身和日志门面&#xff0c;以及比较好的时间等。要关注其历史渊源和设计&#xff08;比如桥接&#xff09;&#xff0c;而具体在使用时查询接口即可&#xff0c;否则会陷入 JUL&#x…

聚类之轮廓系数

Silhouette Score&#xff08;轮廓系数&#xff09;是用于评估聚类质量的指标之一。它衡量了数据点与同簇内其他点的相似度以及与最近簇的相似度之间的对比。 公式 对于一个数据点 i&#xff1a; a(i): 数据点 i 到同簇内其他点的平均距离&#xff08;簇内不相似度&#xff…

问题小记-达梦数据库报错“字符串转换出错”处理

最近遇到一个达梦数据库报错“-6111: 字符串转换出错”的问题&#xff0c;这个问题主要是涉及到一条sql语句的执行&#xff0c;在此分享下这个报错的处理过程。 问题表现为&#xff1a;一样的表结构和数据&#xff0c;执行相同的SQL&#xff0c;在Oracle数据库中执行正常&…

【电路笔记 信号】Metastability 平均故障间隔时间(MTBF)公式推导:进入亚稳态+退出亚稳态+同步器的可靠性计算

这是一个简化的电路分析模型。图2中的典型触发器包括主锁存器、从锁存器和去耦反相器(这个结构类似 主从边沿触发器)。 在亚稳态中&#xff0c;主锁存器的节点A、B的电压电平大致在逻辑“1”&#xff08;VDD&#xff09;和“0”&#xff08;GND&#xff09;之间。确切的电压电平…

【C++】B2066救援题目分析和解决讲解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af; 题目&#x1f4af; 题目分析每个屋顶计算的元素 &#x1f4af; 思路解析1. **读取输入**2. **计算屋顶时间**3. **结果精确取整** &#x1f4af; 完整解决代码&#x1f4a…

springboot创建web项目

一、创建项目 二、导入依赖&#xff08;pom.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

RAID5原理简介和相关问题

1、RAID5工作原理 2、RAID5单块硬盘的数据连续吗&#xff1f; 3、RAID5单块硬盘存储的是原始数据&#xff0c;还是异或后的数据&#xff1f; 4、RAID5的分块大小 ‌RAID5的分块大小一般选择4KB到64KB之间较为合适‌。选择合适的分块大小主要取决于以下几个考量因素&#xff1…

重温设计模式--模板方法模式

文章目录 一、模板方法模式概述二、模板方法模式UML图三、优点1代码复用性高2可维护性好3扩展性强 四、缺点五、使用场景六、C 代码示例1七、 C 代码示例2 一、模板方法模式概述 定义&#xff1a;定义一个操作中的算法骨架&#xff0c;而降一些步骤延迟到子类中。模板方法使得…

Websocket客户端从Openai Realtime api Sever只收到部分数据问题分析

目录 背景 分析 解决方案 背景 正常情况下&#xff0c;会从Openai Realtime api Sever收到正常的json数据,但是当返回音频数据时&#xff0c;总会返回非json数据。这是什么问题呢&#xff1f; 分析 期望的完整响应数据如下&#xff1a; {"session": {"inp…

运动控制卡网络通讯的心跳检测之C#上位机编程

本文导读 今天&#xff0c;正运动小助手给大家分享一下如何使用C#上位机编程实现运动控制卡网络通讯的心跳检测功能。 01 ECI2618B硬件介绍 ECI2618B经济型多轴运动控制卡是一款脉冲型、模块化的网络型运动控制卡。控制卡本身最多支持6轴&#xff0c;可扩展至12轴的运动控制…

SpringBoot状态机

Spring Boot 状态机&#xff08;State Machine&#xff09;是 Spring Framework 提供的一种用于实现复杂业务逻辑的状态管理工具。它基于有限状态机&#xff08;Finite State Machine, FSM&#xff09;的概念&#xff0c;允许开发者定义一组状态、事件以及它们之间的转换规则。…

基于图注意力网络的两阶段图匹配点云配准方法

Two-stage graph matching point cloud registration method based on graph attention network— 基于图注意力网络的两阶段图匹配点云配准方法 从两阶段点云配准方法中找一些图匹配的一些灵感。文章提出了两阶段图匹配点云配准网络&#xff08;TSGM-Net&#xff09; TSGM-Ne…

uniapp跨平台开发---webview调用app方法

1.app端实现 注意:为了实现实时通信,app端页面是.nvue 代码实现 <template><view class"content"><view class"web-view"><web-view class"web-view" :src"url" ref"webview" onPostMessage"o…

【专题】2024年悦己生活消费洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p38654 在当今时代背景下&#xff0c;社会发展日新月异&#xff0c;人们的生活方式与消费观念正经历深刻变革。MoonFox 月狐数据的《2024 年悦己生活消费洞察报告》聚焦于这一充满活力与变化的消费领域。随着就业、婚姻等社会压力的…