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

矩阵题解——螺旋矩阵【LeetCode】

54. 螺旋矩阵

 1.1 核心思想
  • 问题描述:给定一个二维矩阵,按照顺时针螺旋顺序返回所有元素。
  • 解决思路
    1. 定义四个边界:leftrightupdown,分别表示当前螺旋遍历的左、右、上、下边界。
    2. 定义四个方向:(0, 1)(向右)、(1, 0)(向下)、(0, -1)(向左)、(-1, 0)(向上)。
    3. 按照当前方向遍历矩阵,当到达边界时,调整边界并切换到下一个方向。
    4. 重复上述过程,直到遍历完所有元素。
1.2 具体步骤
  1. 初始化
    • 检查矩阵是否为空,如果为空则直接返回空列表。
    • 获取矩阵的行数 M 和列数 N
    • 初始化四个边界:left = 0right = N - 1up = 0down = M - 1
    • 初始化结果列表 res
    • 初始化当前位置 (x, y) 为 (0, 0)
    • 初始化当前方向 cur_d 为 0(向右)。
  2. 螺旋遍历
    • 将当前元素 matrix[x][y] 添加到结果列表 res 中。
    • 检查是否需要切换方向:
      • 如果当前方向是向右(cur_d == 0)且到达右边界(y == right),则切换到向下方向(cur_d = 1),并将上边界 up 加 1。
      • 如果当前方向是向下(cur_d == 1)且到达下边界(x == down),则切换到向左方向(cur_d = 2),并将右边界 right 减 1。
      • 如果当前方向是向左(cur_d == 2)且到达左边界(y == left),则切换到向上方向(cur_d = 3),并将下边界 down 减 1。
      • 如果当前方向是向上(cur_d == 3)且到达上边界(x == up),则切换到向右方向(cur_d = 0),并将左边界 left 加 1。
    • 更新当前位置 (x, y) 为下一个方向的位置。
    • 重复上述过程,直到结果列表 res 的长度等于矩阵元素总数 M * N
  3. 返回结果
    • 返回结果列表 res
    class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:if not matrix or not matrix[0]: return []M, N = len(matrix), len(matrix[0])left, right, up, down = 0, N - 1, 0, M - 1res = []x, y = 0, 0dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]cur_d = 0while len(res) != M * N:res.append(matrix[x][y])if cur_d == 0 and y == right:cur_d += 1up += 1elif cur_d == 1 and x == down:cur_d += 1right -= 1elif cur_d == 2 and y == left:cur_d += 1down -= 1elif cur_d == 3 and x == up:cur_d += 1left += 1cur_d %= 4x += dirs[cur_d][0]y += dirs[cur_d][1]return res
    2.1 时间复杂度
    • 遍历矩阵:每个元素被访问一次,时间复杂度为 O(M * N)
    2.2 空间复杂度
    • 结果列表:存储所有矩阵元素,空间复杂度为 O(M * N)
    • 额外变量:仅使用常数级别的额外空间(如边界变量、方向数组等),空间复杂度为 O(1)
    • 总空间复杂度O(M * N)(主要由结果列表决定)。
    http://www.lqws.cn/news/525115.html

    相关文章:

  • 大模型推理-高通qnn基础
  • PYTHON从入门到实践5-列表操作
  • 超级好用的小软件:geek,卸载软件,2m大小
  • vue2简单的路由切换
  • OpenCV图像旋转:单点旋转与图片旋转
  • Windows10中设置多个虚拟IP方法
  • Linux size命令详解
  • Boss:攻击
  • Azure虚拟机添加磁盘
  • Docker、Docker composer与Docker desktop
  • H5录音、图文视频IndexDB储存最佳实践:用AI生成语音备忘录
  • Fisco Bcos学习 - 开发第一个区块链应用
  • 高防IP能不能防住500GDdos攻击
  • AI系列1-1: 离线部署通义大模型及持续修正-RedHat+NVIDA GPU
  • Java课后习题(编程题)
  • SpringBoot高校党务系统
  • 激光雷达全链路光学系统及探测器能量耦合分析
  • python的少数民族音乐网站系统
  • request这个包中,get 这个方法里传入的是params ,post这个方法里传入的是data 和 json。这个区别是什么?
  • HarmonyOS5 如何性能优化?
  • Vue Devtools “Open in Editor” 配置教程(适用于 VSCode 等主流编辑器)
  • PyTorch RNN实战:快速上手教程
  • 笔记03:布线-过孔的调用与添加
  • 求助deepsee 生成语法树代码
  • matlab机器人工具箱(Robotics Toolbox)安装及使用
  • 使用node的mysql模块操作MySQL数据库
  • 多传感器标定简介
  • Linux驱动学习day7
  • 【kubernetes】--Service
  • C# LINQ语法