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

LeetCode热题100--54.螺旋矩阵--中等

1. 题目

给你一个 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]

2. 题解

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 top = 0, bottom = matrix.length - 1; //上下边界int left = 0, right = matrix[0].length - 1; //左右边界while(top <= bottom && left <= right){//从左到右遍历当前的上边界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;}}

3. 解析

  1. List result = new ArrayList<>();
    初始化一个空列表来存储结果,因为我们从左上角开始以螺旋的顺序遍历矩阵。

  2. if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return result;
    如果输入的矩阵为空或者没有元素,则返回已经初始化的空列表。

  3. int top = 0, bottom = matrix.length - 1; int left = 0, right = matrix[0].length - 1;
    定义四个变量来表示矩阵的边界。顶部、底部、左侧和右侧分别对应行号和列号,用于跟踪遍历过程中的位置。

  4. while(top <= bottom && left <= right) { … }
    这段代码使用循环来以螺旋的顺序访问矩阵,从外到内进行遍历。条件是边界没有相交(即,我们还没有完全遍历完整个矩阵)。

  5. for(int i = left; i <= right; i++) { result.add(matrix[top][i]); } top++;
    从顶部行的左侧到右侧的元素进行循环遍历,并将它们添加到结果列表中。然后,上边界向下移动一步(因为我们已经访问了这一行中的所有元素)。

  6. for(int i = top; i <= bottom; i++) { result.add(matrix[i][right]); } right–;
    从右侧列的顶部到底部的元素进行循环遍历,并将它们添加到结果列表中。然后,有边界向左移动一步(因为我们已经访问了这一列中的所有元素)。

  7. if(top <= bottom) { for(int i = right; i >= left; i–) { result.add(matrix[bottom][i]); } bottom–; }
    如果顶部和底部没有相交,说明我们还没有遍历完最外层的矩阵。这段代码从右侧行的底部到底部的元素进行循环遍历(向后移动)并将它们添加到结果列表中。然后,下边界向上移动一步。

  8. if(left <= right) { for(int i = bottom; i >= top; i–) { result.add(matrix[i][left]); } left++; }
    如果左侧和右侧没有相交,说明我们还没有遍历完最外层的矩阵。这段代码从底部行的左侧到顶部的元素进行循环遍历(向下移动)并将它们添加到结果列表中。然后,左边界向右移动一步。

  9. return result;
    在访问完整个矩阵后,返回最终的结果列表。

相关文章:

  • 商业中的人工智能 (AI) 是什么?
  • 大疆无人机(全系列,包括mini)拉流至电脑,实现直播
  • 【链表扫盲】FROM GPT
  • 第四章 OpenCV篇—图像梯度与边缘检测—Python
  • Rust包、crate与模块管理
  • 【 Redis | 实战篇 短信登录 】
  • CSS:元素显示模式与背景
  • 【图片合并PDF】一次性将多个文件夹里的图片批量按文件夹为单位合并PDF,多个文件夹图片合并PDF,基于WPF的实现方案
  • WPF中解决数据绑定不匹配的问题
  • 【wpf】11 在WPF中实现父窗口蒙版效果:原理详解与进阶优化
  • 【AI提示词】马斯洛需求分析专家
  • WPF主窗体子窗体关联方法
  • 华为云Astro后端开发中对象、事件、脚本、服务编排、触发器、工作流等模块的逻辑关系如何?以iotDA数据传输过程举例演示元素工作过程
  • 网易游戏 Flink 云原生实践
  • DeFi开发系统软件开发:技术架构与生态重构
  • redis多路复用IO模型 以及 6.0引入的多线程模型
  • Python pandas 向excel追加数据,不覆盖之前的数据
  • 记录微信小程序掉起半屏失效问题
  • 全面解析 iTextSharp:在 .NET 中高效处理 PDF
  • 微信小程序执行C语言库的详细方案
  • 抗战回望21︱《“良民”日记》:一个“良民”在沦陷区的见闻与感受
  • 美联储如期按兵不动,强调“失业率和通胀上升的风险均已上升”(声明全文)
  • 中科院院士魏辅文已卸任江西农业大学校长
  • 当年的你,现在在哪里?——新民晚报杯40周年寻人启事
  • 央行:上市公司回购增持股票自有资金比例要求从30%下调至10%
  • 42岁退役军人高武生命最后时刻:在水中托举近20分钟救出落水孩童