博客
关于我
leetcode题解54-螺旋矩阵
阅读量:798 次
发布时间:2023-01-31

本文共 2444 字,大约阅读时间需要 8 分钟。

为了给定矩阵按顺时针螺旋顺序遍历所有元素,可以使用边界变量控制逐层处理四个方向的移动。具体步骤如下:

  • 初始化边界变量left, right, top, bottom分别控制当前层的左、右、上、下。
  • 在每个循环层中,依次向右、向下、向左、向上移动,处理每个方向的元素。
  • 每个方向移动时,确保当前索引处的元素未被访问过,并标记为已访问,加入结果列表。
  • 在处理完四个方向后,收缩边界变量,进入下一层处理。
  • 当无法继续处理时,退出循环。
  • 以下是实现:

    class Solution {    public List
    spiralOrder(int[][] matrix) { List
    result = new ArrayList<>(); int m = matrix.length; if (m == 0) return result; int n = matrix[0].length; int[] visited = new int[m][n]; int left = 0, right = n - 1, top = 0, bottom = m - 1; int count = 0; while (left <= right && top <= bottom) { // Right pass for (int j = left; j <= right; j++) { if (count >= m * n) break; if (visited[top][j] == 0) { result.add(matrix[top][j]); visited[top][j] = 1; count++; } } top++; // Bottom pass for (int i = top; i <= bottom; i++) { if (count >= m * n) break; if (visited[i][right] == 0) { result.add(matrix[i][right]); visited[i][right] = 1; count++; } } right--; // Left pass if (top <= bottom) { for (int j = right; j >= left; j--) { if (count >= m * n) break; if (visited[bottom][j] == 0) { result.add(matrix[bottom][j]); visited[bottom][j] = 1; count++; } } bottom--; } // Up pass if (left <= right) { for (int i = bottom; i >= top; i--) { if (count >= m * n) break; if (visited[i][left] == 0) { result.add(matrix[i][left]); visited[i][left] = 1; count++; } } } } return result; }}

    逐步解释

  • 初始化边界:使用left, right, top, bottom变量来控制当前的遍历范围。
  • 右边界处理:从leftright处理每一行的元素,沿着右方向移动。对每个未访问的元素进行标记并加入结果。
  • 下边界处理:沿着下方向移动,从topbottom行的右边缘(right),对每个未访问的元素标记并加入结果。
  • 左边界处理:需要确保没有进入重复处理。此时,沿着左方向移动从rightleft,处理下一行(bottom)。
  • 上边界处理:沿着上方向移动,从bottomtop,处理左边缘(left)。
  • 收缩边界:在处理完四个方向后,收缩边界变量,移动到下一层处理。
  • 这种方法确保每一层被正确处理,并逐步收缩到矩阵的核心,避免重复访问任何元素,确保按照顺时针螺旋顺序遍历整个矩阵。

    转载地址:http://xegyk.baihongyu.com/

    你可能感兴趣的文章
    panda查找想要找的行合并成一个新pd
    查看>>
    PANDA:基于多列对数据表的行运行计算,并将输出存储在新列中
    查看>>
    PandoraFMS 监控软件 SQL注入漏洞复现
    查看>>
    PandoraFMS 监控软件 任意文件上传漏洞复现
    查看>>
    PanTools多网盘登录神器
    查看>>
    Papyrus项目常见问题解决方案
    查看>>
    Parallel.ForEach使用示例
    查看>>
    Parallel.ForEach的基础使用
    查看>>
    parallels desktop for mac安装虚拟机 之parallelsdesktop密钥 以及 parallels desktop安装win10的办公推荐可以提高办公效率...
    查看>>
    parallelStream导致LinkedList遍历时空指针的问题
    查看>>
    Parameter ‘password‘ not found. Available parameters are [md5String, param1, username, param2]
    查看>>
    ParameterizedThreadStart task
    查看>>
    Paramiko exec_命令的实时输出
    查看>>
    Spring security之管理session
    查看>>
    paramiko模块
    查看>>
    param[:]=param-lr*param.grad/batch_size的理解
    查看>>
    spring mvc excludePathPatterns失效 如何解决spring拦截器失效 excludePathPatterns忽略失效 拦截器失效 spring免验证拦截器不起作用
    查看>>
    Spring Cloud 之注册中心 EurekaServerAutoConfiguration源码分析
    查看>>
    Parrot OS 6.2 重磅发布!推出全新 Docker 容器启动器
    查看>>
    Parrot OS 6.3 发布!全面提升安全性,新增先进工具,带来更高性能
    查看>>