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

[Java恶补day20] 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个轮回=执行1次上、右、下、左
核心思路:用四个变量top、right、bottom、left,表示当前遍历的顶行、右列、底行、左列在一个while循环内(可能需要多个轮回),通过四个并列for循环,分别执行顶行、右列、底行、左列的遍历在每个遍历的for循环后,需要更新变量(遍历顶行后,需要更新top,这样下一次就是遍历下面一行的元素。以此类推),并判断若top>bottom、right<left、bottom<top、left>right,表示当前已遍历完毕,需要退出while循环

测试用例1分析(遍历方向中,逗号左边表示当前遍历的行/列。逗号右边表示当前的遍历方向):
请添加图片描述

测试用例2分析(遍历方向中,逗号左边表示当前遍历的行/列。逗号右边表示当前的遍历方向):
请添加图片描述

时间复杂度: O ( m n ) O(mn) O(mn)。遍历所有元素。
空间复杂度: O ( 1 ) O(1) O(1)。未使用辅助数组,仅使用辅助变量。

class Solution {public List<Integer> spiralOrder(int[][] matrix) {//获取矩阵的行数、列数int m = matrix.length;int n = matrix[0].length;//定义结果列表List<Integer> res = new ArrayList<>();//特殊情况判断if (matrix == null || m == 0) {return res;}//定义当前遍历的行的左端点、右端点 / 列的上端点、下端点int top = 0;int bottom = m - 1;int left = 0;int right = n - 1;while (true) {//动作1:从左到右遍历顶行for (int i = left; i <= right; i++) {res.add(matrix[top][i]);}top++;//更新,下一个轮回将执行下边一行if (top > bottom) {//退出循环,此时已完成操作break;}//动作2:从上到下遍历右列for (int i = top; i <= bottom; i++) {res.add(matrix[i][right]);}right--;//更新,下一个轮回将执行左边一列if (right < left) {//退出循环,此时已完成操作break;}//动作3:从右到左遍历底行for (int i = right; i >= left; i--) {res.add(matrix[bottom][i]);}bottom--;//更新,下一个轮回将执行上边一行if (bottom < top) {//退出循环,此时已完成操作break;}//动作4:从下到上遍历左列for (int i = bottom; i >= top; i--) {res.add(matrix[i][left]);}left++;//更新,下一个轮回将执行右边一列if (left > right) {//退出循环,此时已完成操作break;}}return res;}
}

参考:
1、题解

http://www.xdnf.cn/news/13175.html

相关文章:

  • 互联网大厂Java求职面试:云原生与微服务架构的深度探讨
  • python基础语法Ⅰ
  • 基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
  • el-switch文字内置
  • 配置 macOS 上的 Ruby 开发环境
  • stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
  • 加密通信 + 行为分析:运营商行业安全防御体系重构
  • glb/gltf格式批量转换fbx/obj,材质贴图在,批量转换stl/dae等其他格式,无需一个个打开
  • 国产化Excel处理组件Spire.XLS教程:用 Java 获取所有 Excel 工作表名称(图文详解)
  • 【动态规划 数论】P9759 [COCI 2022/2023 #3] Bomboni|普及+
  • 十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
  • 大模型智能体核心技术:CoT与ReAct深度解析
  • mcts蒙特卡洛模拟树思想
  • 脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
  • 【Rust TCP编程】Rust网络编程之TCP编程语法解析与应用实战
  • PyG测试GCN无线通信网络拓扑推理方法时间复杂度
  • 使用python进行图像处理—像素级操作与图像算术(4)
  • Ai自动补全编程工具:llama vscode
  • kafka-重平衡
  • ES6(ES2015)特性全解析
  • PostgreSQL 对 IPv6 的支持情况
  • C/Python/Go示例 | Socket Programing与RPC
  • MinHook 如何对.NET底层的 Win32函数 进行拦截(上)
  • UE5 学习系列(二)用户操作界面及介绍
  • Python爬虫(四):PyQuery 框架
  • HTML(一)
  • Qt学习及使用_第1部分_认识Qt---Qt开发基本流程
  • centos开启samba服务
  • 可视化预警系统:如何为企业生产保驾护航?
  • DingDing机器人群消息推送