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

【LeetCode】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)。初始时,这些边界分别设置为矩阵的第一行、最后一行、第一列和最后一列。

  2. 循环遍历
    使用一个循环来遍历矩阵的边界。在每次循环中,我们按照顺时针的顺序遍历矩阵的四个边界(上、右、下、左),并将遍历到的元素添加到结果列表中。

  3. 更新边界
    在遍历完每个边界后,我们需要根据遍历的方向来更新相应的边界变量。具体来说:

    • 遍历完上边界后,上边界下移(top++)。
    • 遍历完右边界后,右边界左移(right--)。
    • 遍历完下边界后,下边界上移(bottom--)。
    • 遍历完左边界后,左边界右移(left++)。
  4. 终止条件
    循环会一直进行,直到四个边界交叉,即左边界超过右边界(left > right)或上边界超过下边界(top > bottom)。这时,表示矩阵中的所有元素都已经被遍历完毕,可以结束循环。

  5. 返回结果
    循环结束后,返回存储了按顺时针螺旋顺序遍历的矩阵元素的结果列表。

        注意,在遍历右边界和下边界时,需要添加一个检查来确保内部还有元素需要遍历。这是因为当矩阵的行数或列数为奇数时,遍历完上边界和左边界后,右边界或下边界可能只剩下单独的一行或一列。如果不进行检查,就会在这一行或一列上重复遍历,导致结果错误。

代码实现:

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> result = new ArrayList<>(); // 初始化结果列表  if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {  // 如果矩阵为空或没有行/列,则直接返回空的结果列表  return result;  }  int left = 0, right = matrix[0].length - 1; // 初始化左右边界  int top = 0, bottom = matrix.length - 1; // 初始化上下边界  while (left <= right && top <= bottom) {  // 遍历上边界  for (int i = left; i <= right; i++) {  result.add(matrix[top][i]); // 将上边界的元素添加到结果列表中  }  top++; // 上边界下移  // 遍历右边界  for (int i = top; i <= bottom; i++) {  result.add(matrix[i][right]); // 将右边界的元素添加到结果列表中  }  right--; // 右边界左移  // 检查是否还有内部元素需要遍历(避免在只剩一行或一列时重复遍历)  if (top <= bottom) {  // 遍历下边界  for (int i = right; i >= left; i--) {  result.add(matrix[bottom][i]); // 将下边界的元素添加到结果列表中  }  bottom--; // 下边界上移  }  if (left <= right) {  // 遍历左边界  for (int i = bottom; i >= top; i--) {  result.add(matrix[i][left]); // 将左边界的元素添加到结果列表中  }  left++; // 左边界右移  }  }  return result; // 返回结果列表  }
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 自动回复的AI小助手,人工智能还是人工智障
  • MTK Android 12 Clone Project 克隆项目
  • 清华和字节联合推出的视频理解大模型video-SALMONN(ICML 2024)
  • heapq.heapify构建小顶堆的流程
  • 电脑新加的硬盘如何分区?新加硬盘分区选MBR还是GPT
  • ⭕️【论文阅读】《Interactive Class-Agnostic Object Counting》
  • Spring-包扫描
  • Go sdk下载和配置环境变量
  • 60、PHP 实现 单词查找树算法
  • M.2接口
  • STM32 GPIO 模块
  • VsCode无法远程调试
  • 如何理解供应链控制塔?详解供应链控制塔类型与架构!
  • MiniCPM-V: A GPT-4V Level MLLM on Your Phone 手机上的 GPT-4V 级多模态大模型
  • 哪个牌子手持洗拖一机好?多款热门家用洗地机推荐
  • CODING 缺陷管理功能正式开始公测
  • create-react-app项目添加less配置
  • Fundebug计费标准解释:事件数是如何定义的?
  • java2019面试题北京
  • java8-模拟hadoop
  • Linux下的乱码问题
  • MySQL用户中的%到底包不包括localhost?
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Shell编程
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 复杂数据处理
  • 基于axios的vue插件,让http请求更简单
  • 微信公众号开发小记——5.python微信红包
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 与 ConTeXt MkIV 官方文档的接驳
  • 怎样选择前端框架
  • 找一份好的前端工作,起点很重要
  • raise 与 raise ... from 的区别
  • ######## golang各章节终篇索引 ########
  • #stm32整理(一)flash读写
  • $jQuery 重写Alert样式方法
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (zt)最盛行的警世狂言(爆笑)
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (回溯) LeetCode 40. 组合总和II
  • (南京观海微电子)——COF介绍
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (杂交版)植物大战僵尸
  • (转)Scala的“=”符号简介
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .Net中的集合
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • /etc/skel 目录作用
  • ??eclipse的安装配置问题!??
  • [《百万宝贝》观后]To be or not to be?
  • [2021 蓝帽杯] One Pointer PHP
  • [BUUCTF 2018]Online Tool