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

[Day 16]螺旋遍历二维数组

今天我们看一下力扣上的这个题目:146.螺旋遍历二维数组

题目描述:

给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。
螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。
示例 1:
输入:array = [[1,2,3],[8,9,4],[7,6,5]]
输出:[1,2,3,4,5,6,7,8,9]
示例 2:
输入:array = [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]
输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
限制:
0 <= array.length <= 100
0 <= array[i].length <= 100

思路

这道题和力扣54题是差不多一样的,我前面也有讲过,大家可以先做做。本道题是一个螺旋矩阵的题,面对这样的题,我们应该想到的是画个图遍历一下这个过程,我们可以得到如下的图:
首先我们先定义一个新数组用来存储数据的并判断一下这个二维数组是否为空,如果是空就返回空数组。如果第一行也是空,那么也是返回空。

  vector<int> res;if (array.empty() || array[0].empty()) {return res;}

接下来我们可以分为:从左到右遍历,从上到下遍历,从右到左遍历,从下到上遍历
在这里插入图片描述
1.从左到右遍历:
我们先定义一个left、right来遍历左右,定义top、bottom为上下。当top<=bottom或者left<=right时,循环一直继续。

		int left = 0;//初始化左边int right = array[0].size() - 1;//初始化右边为第一行数组最后一个数int top = 0;//初始化top为从上到下第一个int bottom = array.size() - 1;//初始化下边为最下列的数for (int i = left; i <= right; i++) {//定义i从最左边开始遍历,一直到第一行最后一个数res.push_back(array[top][i]);//二维数组横坐标不变,纵坐标变化尾插到新数组中}top++;//top向前走继续遍历第二行

在这里插入图片描述
2.从上到下遍历
列不变,行改变

for (int i = top; i <= bottom; i++) {//i从top开始,到bottom结束res.push_back(array[i][right]);//尾插到right这一列}right--;//列数减小

3.从右到左遍历
行不变,列变

 if (top <= bottom) {//判断一下top>bottom时,证明遍历完了,直接返回for (int i = right; i >=left; i--) {//i从右边开始,一直到大于等于left,进行--的操作res.push_back(array[bottom][i]);//尾插到bottom行,i列}bottom--;//bottom向上移动减少}

4.从下到上遍历
列不变,行变

    if (left <= right) {//当左边大于右边的时候,没有要遍历的了for (int i = bottom; i >= top; i--) {//i从bottom开始遍历到topres.push_back(array[i][left]);//尾插到left列}}left++;//完了之后left向左移动加加

最后,返回这个新数组res

完整代码

class Solution {
public:vector<int> spiralArray(vector<vector<int>>& array) {vector<int> res;if (array.empty() || array[0].empty()) {return res;}int left = 0;int right = array[0].size() - 1;int top = 0;int bottom = array.size() - 1;while (top <= bottom && left <= right) {for (int i = left; i <= right; i++) {res.push_back(array[top][i]);}top++;for (int i = top; i <= bottom; i++) {res.push_back(array[i][right]);}right--;if (top <= bottom) {for (int i = right; i >=left; i--) {res.push_back(array[bottom][i]);}bottom--;}if (left <= right) {for (int i = bottom; i >= top; i--) {res.push_back(array[i][left]);}}left++;}return res;}
};

总结

本道题要明确四个循环过程,进行四轮遍历就可以将二维数组都遍历上,也要注意取等号i>=right是要取到right这个边界的。总体来说,螺旋矩阵就是四个循环把握好,就简单了。希望我的理解对大家有帮助~

相关文章:

[Day 16]螺旋遍历二维数组

今天我们看一下力扣上的这个题目&#xff1a;146.螺旋遍历二维数组 题目描述&#xff1a; 给定一个二维数组 array&#xff0c;请返回「螺旋遍历」该数组的结果。 螺旋遍历&#xff1a;从左上角开始&#xff0c;按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c…...

【教程】docker升级镜像

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 自动升级 手动升级 无论哪种方式&#xff0c;最重要的是一定要通过-v参数做数据的持久化&#xff01; 自动升级 使用watchtower&#xff0c;可…...

使用jmeter进行压力测试

使用jmeter进行压力测试 jmeter安装 官网安装包下载&#xff0c;选择二进制文件&#xff0c;解压。 tar -xzvf apache-jmeter-x.tgz依赖jdk安装。 yum install java-1.8.0-openjdk环境变量配置&#xff0c;修改/etc/profile文件&#xff0c;添加以下内容。 export JMETER/…...

链表和 list

一、单链表的模拟实现 1.实现方式 链表的实现方式分为动态实现和静态实现两种。 动态实现是通过 new 申请结点&#xff0c;然后通过 delete 释放结点的形式构造链表。这种实现方式最能体 现链表的特性&#xff1b; 静态实现是利用两个数组配合来模拟链表。一个表示数据域&am…...

【AI大模型】Ubuntu18.04安装deepseek-r1模型+服务器部署+内网访问

以下内容主要参考博文&#xff1a;DeepSeek火爆全网&#xff0c;官网宕机&#xff1f;本地部署一个随便玩「LLM探索」 - 程序设计实验室 - 博客园 安装 ollama Download Ollama on Linux curl -fsSL https://ollama.com/install.sh | sh 配置 ollama 监听地址 ollama 安装后…...

cmd执行mysql命令

安装mysql之后如果想使用cmd执行mysql命令&#xff0c;需要怎么操作呢&#xff0c;下面一起看一下。 安装mysql之后&#xff0c;如果直接去cmd窗口执行MySQL命令&#xff0c;窗口可能会提示mysql不是可执行命令。 需要配置系统的环境变量&#xff0c;将mysql的安装路径配置系…...

网络安全威胁框架与入侵分析模型概述

引言 “网络安全攻防的本质是人与人之间的对抗&#xff0c;每一次入侵背后都有一个实体&#xff08;个人或组织&#xff09;”。这一经典观点概括了网络攻防的深层本质。无论是APT&#xff08;高级持续性威胁&#xff09;攻击、零日漏洞利用&#xff0c;还是简单的钓鱼攻击&am…...

【算法】动态规划专题⑦ —— 多重背包问题 + 二进制分解优化 python

目录 前置知识进入正题优化方法&#xff1a;二进制分解实战演练 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 python 【算法】动态规划专题⑥ —— 完全背包问题 python 进入正题 多重背包问题I https://www.acwing.com/problem/content/4/ 题目描述 有…...

详细教程 | 如何使用DolphinScheduler调度Flink实时任务

Apache DolphinScheduler 非常适用于实时数据处理场景&#xff0c;尤其是与 Apache Flink 的集成。DolphinScheduler 提供了丰富的功能&#xff0c;包括任务依赖管理、动态调度、实时监控和日志管理&#xff0c;能够有效简化 Flink 实时任务的管理和部署。通过 DolphinSchedule…...

PHP之hyperf学习笔记

Hyperf Model,Dao&#xff0c;Service&#xff0c;Contronller 路由 使用文件来配置路由&#xff0c;就是和laravel一样的 Router::addGroup(["middleware" > ["web", "auth"],"namespace" > "Hyperf\HttpServer\Contr…...

react的antd表格数据回显在form表单中

1、首先为table添加编辑按钮 {title: 操作,align: center,render: (_: any, record: any) > (<div style{{ display: flex, alignItems: center, justifyContent: space-evenly }}><Buttonsize"small"onClick{() > deitor(record)} style{{ margin…...

【通俗易懂说模型】线性回归(附深度学习、机器学习发展史)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...

【R语言】apply函数族

在R语言中使用循环操作时是使用自身来实现的&#xff0c;效率较低。所以R语言有一个符合其统计语言出身的特点&#xff1a;向量化。R语言中的向量化运用了底层的C语言&#xff0c;而C语言的效率比高层的R语言的效率高。 apply函数族主要是为了解决数据向量化运算的问题&#x…...

传统营销架构在当下如何进行优化转型?

随着市场环境的变化和数字技术的发展&#xff0c;传统营销架构越来越难以适应当下的营销市场。为了适应新时代的要求&#xff0c;企业也需要对营销架构进行优化转型。企业主可以着手从哪些方面进行调整呢&#xff1f;下面就来一同探讨下。 一、强调扁平化原则 扁平化与去中心化…...

QMK启用摇杆和鼠标按键功能

虽然选择了触摸屏&#xff0c;我仍选择为机械键盘嵌入摇杆模块&#xff0c;这本质上是对"操作连续性"的执着。   值得深思的是&#xff0c;本次开发过程中借助DeepSeek的代码生成与逻辑推理&#xff0c;其展现的能力已然颠覆传统编程范式&#xff0c;需求描述可自动…...

计算机网络-SSH基本原理

最近年底都在忙&#xff0c;然后这两天好点抽空更新一下。前面基本把常见的VPN都学习了一遍&#xff0c;后面的内容应该又继续深入一点。 一、SSH简介 SSH&#xff08;Secure Shell&#xff0c;安全外壳协议&#xff09;是一种用于在不安全网络上进行安全远程登录和实现其他安…...

yolov11模型在Android设备上运行【踩坑记录】

0) 参考资料: https://github.com/Tencent/ncnn?tabreadme-ov-file https://github.com/pnnx/pnnx https://github.com/nihui/ncnn-android-yolov5 https://github.com/Tencent/ncnn?tabreadme-ov-file 1) &#xff1a;将xxx.pt模型转化成 xxx.onnx ONNX&#xff08;Ope…...

Linux在x86环境下制作ARM镜像包

在x86环境下制作ARM镜像包&#xff08;如qemu.docker&#xff09;&#xff0c;可以通过QEMU和Docker的结合来实现。以下是详细的步骤&#xff1a; 安装QEMU-user-static QEMU-user-static是一个静态编译的QEMU二进制文件&#xff0c;用于在非目标架构上运行目标架构的二进制文…...

win编译openssl

一、perl执行脚本 1、安装perl脚本 perl安装 2、配置perl脚本 perl Configure VC-WIN32 no-asm no-shared --prefixE:\openssl-x.x.x\install二、编译openssl 1、使用vs工具编译nmake 如果使用命令行nmake编译会提示“无法打开包括文件: “limits.h”“ 等错误信息 所以…...

为什么说,在IT行业中长期从事外包岗位没有前途?

文章目录 前言一、职业发展与技能提升受限二、工作稳定性和归属感缺失三、薪资待遇和福利差异四、行业声誉和求职歧视总结 前言 在IT行业中&#xff0c;由于企业要降低成本、优化资源、分散风险以及满足市场需求和技术需求等原因&#xff0c;存在大量的外包岗位。很多人都说长…...

【B站保姆级视频教程:Jetson配置YOLOv11环境(七)Ultralytics YOLOv11配置】

Jetson配置YOLOv11环境&#xff08;7&#xff09;Ultralytics YOLOv11环境配置 文章目录 1. 下载YOLOv11 github项目2. 安装ultralytics包3. 验证ultralytics安装3.1 下载yolo11n.pt权重文件3.2 推理 1. 下载YOLOv11 github项目 创建一个目录&#xff0c;用于存放YOLOv11的项目…...

硬核技术:小程序能够调用手机的哪些传感器

一、加速度传感器 小程序可以调用手机的加速度传感器来检测设备的运动状态。加速度传感器能够测量设备在三个轴&#xff08;X、Y、Z&#xff09;上的加速度变化。通过分析这些数据&#xff0c;小程序可以实现一些功能&#xff0c;如运动检测、步数统计、游戏中的动作感应等。 健…...

Day 31 卡玛笔记

这是基于代码随想录的每日打卡 491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0…...

【蓝桥杯嵌入式】4_key:单击+长按+双击

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 将4个按键的引脚设置为input&#xff0c;并将初始状态设置为Pull-up&#xff08;上拉输入&#xff09; 为解决按键抖动的问题&#xff0c;我们…...

Synchronized和ReentrantLock面试详解

前言 接下来为大家带来的是 Java 中的两个典型锁代表&#xff1a;Synchronized 和 ReentrantLock 的详解 面试题&#xff1a;谈一谈AQS 在说 ReentrantLock 时&#xff0c;有必要先了解一下 AQS&#xff0c;因为 ReentrantLock 就是基于 AQS 实现的 分析&#xff1a; 共享…...

1.2 学习驱动(Driver)分为几步?

文章目录 前言一、什么是UVM中的驱动&#xff08;Driver&#xff09;&#xff1f;二、如何理解Driver&#xff1f;三、如何使用Driver&#xff1f;第一步&#xff1a;定义Driver类第二步&#xff1a;实现run_phase任务第三步&#xff1a;实现驱动任务第四步&#xff1a;实例化和…...

【MySQL篇】事务的认识以及四大特性

何为事务&#xff1f; 事务&#xff08;Transaction&#xff09;是指一组操作的集合&#xff0c;这些操作要么全部执行成功&#xff0c;要么全部不执行。事务通常用于保证数据库的一致性、完整性和可靠性&#xff0c;确保数据的完整性与正确性。 有效避免部分执行&#xff0c…...

2.7日学习总结

深入探究栈、队列与二叉树 一、栈的深度剖析 进阶特性&#xff1a;除了常规的入栈、出栈操作&#xff0c;栈在处理函数调用、表达式求值等场景时&#xff0c;展现出独特的递归模拟能力。利用栈可以将递归算法转化为非递归形式&#xff0c;有效避免因递归过深导致的栈溢出问题。…...

SQL带外注入

SQL 带外注入&#xff08;Out-of-Band SQL Injection, OOB SQLi&#xff09; 是 SQL 注入的一种特殊类型&#xff0c;主要用于以下情况&#xff1a; 数据库没有直接返回错误信息&#xff08;比如被防火墙拦截了&#xff09;。无法使用常规注入手法&#xff08;如 UNION、错误信…...

Nginx进阶篇 - nginx多进程架构详解

文章目录 1. nginx的应用特点2. nginx多进程架构2.1 nginx多进程模型2.2 master进程的作用2.3 进程控制2.4 worker进程的作用2.5 worker进程处理请求的过程2.6 nginx处理网络事件 1. nginx的应用特点 Nginx是互联网企业使用最为广泛的轻量级高性能Web服务器&#xff0c;其特点是…...