力扣最热一百题——螺旋矩阵

目录

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

题目描述

示例

提示:

解法一:模拟

1. 边界初始化

2. 循环遍历矩阵

3. 从左到右遍历上边界

4. 从上到下遍历右边界

5. 从右到左遍历下边界

6. 从下到上遍历左边界

7. 结束条件

代码执行流程总结

Java写法:

运行时间以及内存消耗

C++写法:

运行时间以及内存消耗

总结


题目链接: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


解法一:模拟

按照顺时针方向从外圈到内圈依次读取矩阵中的元素。具体实现思路可以分为以下几个步骤:

1. 边界初始化

  • 定义四个边界:top, bottom, left, right,分别表示矩阵的上边界、下边界、左边界和右边界。
  • 初始时,top 为 0(最上方),bottom 为矩阵的最后一行索引,left 为 0(最左边),right 为矩阵的最后一列索引。

2. 循环遍历矩阵

  • 进入 while 循环,条件是:top <= bottom && left <= right。这意味着当矩阵还未完全遍历时,继续循环。
  • 在每次循环中,按照四个方向依次遍历:从左到右、从上到下、从右到左、从下到上。每次遍历完一条边界后,收缩该边界(即移动内圈的边界)。

3. 从左到右遍历上边界

  • 首先,遍历当前 top 行,从 leftright,将该行的所有元素依次添加到结果数组中。
  • 遍历完成后,将 top 变量加 1,表示上边界下移一行,进入内层。

4. 从上到下遍历右边界

  • 然后,遍历当前 right 列,从 topbottom,将该列的所有元素依次添加到结果数组中。
  • 遍历完成后,将 right 变量减 1,表示右边界左移一列。

5. 从右到左遍历下边界

  • 如果 top <= bottom 仍然成立(即还有未遍历的行),开始遍历 bottom 行,从 rightleft,将该行的所有元素依次添加到结果数组中。
  • 遍历完成后,将 bottom 变量减 1,表示下边界上移一行。

6. 从下到上遍历左边界

  • 如果 left <= right 仍然成立(即还有未遍历的列),开始遍历 left 列,从 bottomtop,将该列的所有元素依次添加到结果数组中。
  • 遍历完成后,将 left 变量加 1,表示左边界右移一列。

7. 结束条件

  • 循环不断缩小边界,直到 top > bottomleft > right,表示已经遍历完所有的元素,此时退出循环。
  • 返回保存螺旋顺序的 res 数组。

代码执行流程总结

  1. 每次从四个方向依次遍历矩阵的当前边界。
  2. 每遍历完一条边界,收缩该边界,进入下一层的螺旋圈。
  3. 重复上述步骤,直到所有元素都被遍历完。

Java写法:

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<>();if (matrix == null || matrix.length == 0) {return res;}int top = 0; // 上边界int bottom = matrix.length - 1; // 下边界int left = 0; // 左边界int right = matrix[0].length - 1; // 右边界while (top <= bottom && left <= right) {// 从左到右遍历当前的上边界for (int i = left; i <= right; i++) {res.add(matrix[top][i]);}top++; // 上边界收缩// 从上到下遍历当前的右边界for (int i = top; i <= bottom; i++) {res.add(matrix[i][right]);}right--; // 右边界收缩// 判断是否还需要遍历if (top <= bottom) {// 从右到左遍历当前的下边界for (int i = right; i >= left; i--) {res.add(matrix[bottom][i]);}bottom--; // 下边界收缩}// 判断是否还需要遍历if (left <= right) {// 从下到上遍历当前的左边界for (int i = bottom; i >= top; i--) {res.add(matrix[i][left]);}left++; // 左边界收缩}}return res;}
}

 

运行时间以及内存消耗

C++写法:

#include <vector>
using namespace std;class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> res;if (matrix.empty() || matrix[0].empty()) {return res;}int top = 0; // 上边界int bottom = matrix.size() - 1; // 下边界int left = 0; // 左边界int right = matrix[0].size() - 1; // 右边界while (top <= bottom && left <= right) {// 从左到右遍历当前的上边界for (int i = left; i <= right; i++) {res.push_back(matrix[top][i]);}top++; // 上边界收缩// 从上到下遍历当前的右边界for (int i = top; i <= bottom; i++) {res.push_back(matrix[i][right]);}right--; // 右边界收缩// 判断是否还需要遍历if (top <= bottom) {// 从右到左遍历当前的下边界for (int i = right; i >= left; i--) {res.push_back(matrix[bottom][i]);}bottom--; // 下边界收缩}// 判断是否还需要遍历if (left <= right) {// 从下到上遍历当前的左边界for (int i = bottom; i >= top; i--) {res.push_back(matrix[i][left]);}left++; // 左边界收缩}}return res;}
};
运行时间以及内存消耗


总结

这里的边界条件实在是非常的难把握,所实话,一但掉入了边界条件的陷阱之后就会让你一直缝缝补补,很难有几率能缝缝补补出来。

正如那句话所说:一如入循环深似海,从此offer是路人

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【GPU版】Windows下PyTorch入门深度学习环境安装与配置

如果电脑有NVIDIA GPU显卡&#xff0c;看【GPU版本】&#xff1b;否则&#xff0c;看【CPU版本】 聊聊PyTorch和Tensorflow 它们都是python的库/包 pip3是给python3使用的&#xff0c;由于现在用的python基本上都是3以上版本&#xff0c;所以pip和pip3没有区别 聊聊Anacond…

DNC Server 开发

每个工厂里面的机床系统类型各式各样,程序传输DNC 功能可以提高技术人员的工作效率,怎样兼容每种系统是个难题,如果是做工厂信息化的工程师也是比较头疼,下面给出一个解决方案,抛砖引玉 我们可以使用一种框架 满足插件式开发,主程序负责管理插件,具体的上传 下载 删除 查询等具…

第108集《大佛顶首楞严经》

请打开讲义241面。我们讲到嗅报&#xff0c;鼻根当中嗅的功能。 本根发相 发明二相&#xff1a;一者通闻&#xff0c;被诸恶气&#xff0c;熏极心扰。二者塞闻&#xff0c;气掩不通&#xff0c;闷绝于地。 以鼻根造业到无间地狱以后&#xff0c;他有二种受苦的相状&#xf…

Java数据结构——Set和Map

掌握 Map/Set 及实际实现类 HashMap/TreeMap/HashSet/TreeSet 的使用。掌握 TreeMap 和 TreeSet 背后的数据结构搜索树的原理和简单实现。掌握 HashMap 和 HashSet 背后的数据结构哈希表的原理和简单实现。 目录 1.搜索 1.1概念及场景 1.2模型 2. Map的使用 2.1关于Map的说…

【5G QoS】详解5G QoS端到端工作机制

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

同城找搭子小程序有哪些?找搭子社交软件测评笔记分享

寻找搭子不再迷茫&#xff01;今日测评几款热门找搭子小程序&#xff0c;为你开启全新社交体验。真实体验&#xff0c;深度剖析&#xff0c;帮你找到最适合的搭子平台&#xff0c;快来一探究竟。 1. 咕哇找搭子小程序&#xff1a;这是一个实名制的找搭子交友平台。正是由于实名…

力扣(leetcode)每日一题 2848 与车相交的点

2848. 与车相交的点 - 力扣&#xff08;LeetCode&#xff09; 题干 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums[i] [starti, endi] &#xff0c;其中 starti 是第 i 辆车的起点&#xff0c;endi 是第 i 辆车的终…

四款好用英语翻译工具的全面指南

对于经常需要与工作或学习相关的英语资料打交道的人来说&#xff0c;翻译工具成为了我们日常的得力助手;现在市场上的英语翻译工具琳琅满目&#xff0c;各有千秋;今天&#xff0c;我就来为大家推荐几款我个人觉得非常实用的翻译工具: 第一款&#xff1a;福昕在线翻译 说到这一…

关于wp网站出现的问题

问题1 问题1&#xff1a;如果出现这个界面的问题 说明是根目录的index.php编码出了问题&#xff0c;用备份的源文件退换一下即可。 问题2 问题2&#xff1a;如果出现页面错位现象&#xff0c;可能是某个WP插件引起的问题&#xff0c;这里需要逐步排查插件&#xff0c;或者你刚…

【计算机网络 - 基础问题】每日 3 题(六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

echo 命令:终端输出文本

一、echo 命令简介 ​echo​命令用于在终端上打印简单的文本消息、变量值或者将文本输出到文件中。 ‍ ​echo​ 命令在脚本编写、简单调试和显示信息时非常有用。可以用来输出状态信息、变量值或者作为其他命令的输入。 ‍ 相关命令&#xff1a;printf 命令比 echo 命令提…

数据可视化与分析:数据时代的关键工具

一、引言 数据可视化与分析是大数据时代中最为重要的技术之一。随着数据量的不断增加&#xff0c;如何有效地理解、解释和利用数据&#xff0c;已经成为各行各业面临的关键挑战。数据可视化通过图表、图形和互动界面将数据以直观的方式呈现&#xff0c;帮助用户快速识别数据中…

redis短信登录模型

基于Session实现登录 &#xff0c;

OpenGL Texture C++ Camera Filter滤镜

基于OpenGL Texture纹理的强大功能&#xff0c;在片段着色器&#xff08;Shader&#xff09;中编写GLSL代码&#xff0c;对YUV的数据进行数据转换从而实现视频编辑软件中的相机滤镜功能。 接上一篇OpenGL Texture C 预览Camera视频的功能实现&#xff0c;本篇来实现Camera滤镜效…

【数据结构】8——图3,十字链表,邻接多重表

数据结构8——图3&#xff0c;十字链表&#xff0c;邻接多重表 文章目录 数据结构8——图3&#xff0c;十字链表&#xff0c;邻接多重表前言一、十字链表结构例子 复杂例子 二、邻接多重表&#xff08;Adjacency Multilist&#xff09;例子 前言 除了之前的邻接矩阵和邻接表 …

Java抽象类和接口的学习了解

目录 1. 抽象类 1.1 抽象类概念 1.2例子 1.3 抽象类语法 1.被 abstract 修饰的类--抽象类 2.抽象类中被 abstract 修饰的方法--抽象方法&#xff0c;该方法不用给出具体的实现体 3.当一个类中含有抽象方法时&#xff0c;该类必须要abstract修饰 4.抽象类也是类&#xff…

PCIe进阶之TL:Address Spaces, Transaction Types, and Usage

1 Transaction Layer Overview 如上图为PCIe设备的一个分层结构,从上层逻辑看,事务层的关键点是: 流水线式的完整的 split-transaction 协议事务层数据包(TLP)的排序和处理基于信用的流控制机制可选支持的数据中毒功能和端到端数据完整性检测功能事务层包含以下内容: TLP…

828华为云征文|部署在线文件管理器 Spacedrive

828华为云征文&#xff5c;部署在线文件管理器 Spacedrive 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 产品优势1.3 计费模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Spacedrive3.1 Spacedrive 介绍3.2 Docker 环境搭建3.3 Spac…

JNI 详细介绍

一 介绍 java调⽤c&#xff0c;c代码可以通过JNIEnv执行java代码。 安卓NDK 已经对JNI环境进行了集成&#xff0c;我们可以通过android studio来快速搭建一个项目。 二 项目搭建 打开android studio 创建工程&#xff0c;创建工程选择模板Native C 三 模板格式介绍 生成的…

基于Python实现的一个电影知识库QA系统

1. 实现效果 1. 图形展示 这是使用echarts.js 来实现的自定义页面的图谱展示&#xff0c;当然还有其他的库也能实现类似的效果&#xff0c;这里看各位的选择。 这里我在每个实体之间都实现了双层关系的绑定&#xff0c;这对于后面实现检索会有点帮助 2. 实体搜索展示 这里…