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

[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这个边界的。总体来说,螺旋矩阵就是四个循环把握好,就简单了。希望我的理解对大家有帮助~

http://www.lryc.cn/news/533024.html

相关文章:

  • 大模型的底层逻辑及Transformer架构
  • 数据结构-基础
  • SystemUI中NavigationBar分析
  • MySQL的底层原理与架构
  • 三极管的截止、放大、饱和区
  • 2025-2-7-算法学习(一) 动态规划-习题1 300.最长递增子序列
  • 学习日记-250207
  • 【Block总结】PSA,金字塔挤压注意力,解决传统注意力机制在捕获多尺度特征时的局限性
  • 代码随想录算法训练营第三十一天| 回溯算法04
  • pycharm集成通义灵码应用
  • 赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索
  • 【Leetcode刷题记录】54. 螺旋矩阵--模拟,以及循环条件处理的一些细节
  • c++计算机教程
  • 蓝桥杯Java之输入输出练习题
  • 【R语言】环境空间
  • 【系统架构设计师】分布式数据库透明性
  • openpnp2.2 - 环境搭建 - 编译 + 调试 + 打包
  • OpenCV:图像修复
  • QT全局所有QSS样式实时切换
  • MySQL三大版本的演进
  • 利用 IMU 估计人体关节轴向和位置 —— 论文推导
  • 脚本一键生成管理下游k8s集群的kubeconfig
  • 数据库系统概念第六版记录 三
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-files.py
  • 微信小程序案例1——制作猫眼电影底部标签导航栏
  • 【大数据技术】搭建完全分布式高可用大数据集群(Kafka)
  • 【服务器知识】如何在linux系统上搭建一个nfs
  • 图片画质增强:轻松提升画质
  • vscode快速接入deepseek 实践操作
  • mapbox进阶,添加绘图扩展插件,绘制圆形