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

devtools/2025/2/8 12:32:49/

今天我们看一下力扣上的这个题目: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这个边界的。总体来说,螺旋矩阵就是四个循环把握好,就简单了。希望我的理解对大家有帮助~


http://www.ppmy.cn/devtools/157089.html

相关文章

2025蓝桥杯JAVA编程题练习Day2

1.大衣构造字符串 问题描述 已知对于一个由小写字母构成的字符串&#xff0c;每次操作可以选择一个索引&#xff0c;将该索引处的字符用三个相同的字符副本替换。 现有一长度为 NN 的字符串 UU&#xff0c;请帮助大衣构造一个最小长度的字符串 SS&#xff0c;使得经过任意次…

流行的开源高性能数据同步工具 - Apache SeaTunnel 整体架构运行原理

概述 背景 数据集成在现代企业的数据治理和决策支持中扮演着至关重要的角色。随着数据源的多样化和数据量的迅速增长&#xff0c;企业需要具备强大的数据集成能力来高效地处理和分析数据。SeaTunnel通过其高度可扩展和灵活的架构&#xff0c;帮助企业快速实现多源数据的采集、…

汽车之家查看内饰图的方法

汽车之家的地址&#xff1a;汽车之家 1.打开汽车之家的地址&#xff0c;进入汽车之家的页面&#xff0c;在搜索框中&#xff0c;输入想要搜索的车型 2、搜索以后&#xff0c;点击车型的页面 3.选择图片实拍

SpringBoot+SpringDataJPA项目中使用EntityManager执行复杂SQL

import javax.annotation.Resource; import javax.persistence.EntityManager;Resource private EntityManager entityManager; //1. 查询数据 public List<Object[]> getAllPersons() { String sql "SELECT * FROM table_name"; return entityMa…

【每天学点AI】实战仿射变换在人工智能图像处理中的应用

01 引言 想象一下&#xff0c;当你拿起手机拍摄一张风景照时&#xff0c;由于角度或设备本身的限制&#xff0c;照片可能会有点歪斜或者变形。这时候&#xff0c;你是否希望有一种方法可以简单地“拉直”这张照片&#xff0c;让它看起来更加完美&#xff1f;或者&#xff0c;在…

基于springboot+vue的社区居民诊疗健康管理系统设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

全志A133 android10 thermal温控策略配置调试

一&#xff0c;功能介绍 Thermal简称热控制系统&#xff0c;其功能是通过temperature sensor&#xff08;温度传感器&#xff09;测量当前CPU、GPU等设备的温度值&#xff0c;然后根据此温度值&#xff0c;影响CPU、GPU等设备的调频策略&#xff0c;对CPU、GPU等设备的最大频率…

vLLM框架:使用大模型推理框架

vLLM 专为高效部署大规模语言模型设计&#xff0c;尤其适合高并发推理场景&#xff0c;关于对vLLM的介绍请看这篇博文。以下从 安装配置、基础推理、高级功能、服务化部署 到 多模态扩展 逐步讲解。 1. 环境安装与配置 1.1 硬件要求 GPU: 支持 CUDA 11.8 及以上&#xff08;…