LeetCode螺旋矩阵

快一个月没刷题了,最近工作有些忙,今天闲下来两小时,刷一道

题目描述

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

解题思路

控制上下边界、左右边界。每一次循环走一圈,走完一圈上下左右边界往内部压缩。结束条件是left>right top>bottom

  • 首先初始化上边界为第0行,下边界为最后一行,左边界是第0列,右边界是最后一列。可以看出边界就是要加到res(返回数组)的一圈。
  • 接下来一个循环,条件是true(无限循环),虽然终止条件是left>right top>bottom,但是在走一圈的过程中就可能会触发终止条件,而不是一圈结束了才会触发终止条件。因此在遍历四个时,每遍历一个边就判断一次终止条件

代码

javascript 复制代码
var spiralOrder = function(matrix) {
    let left = 0; // 初始化左边界为第0列
    let right = matrix[0].length-1; // 初始化右边界为最后一列
    let top = 0; // 初始化上边界为第0行
    let bottom = matrix.length-1; // 初始化下边界为最后一行
    let res = []; // 初始化结果数组,用于存储最终的螺旋顺序元素
    while(true){ // 开始一个无限循环
        for(let i=left;i<=right;i++){ // 从左到右遍历第一行
            res.push(matrix[top][i]); // 将第一行的元素添加到结果数组
        }
        top++; // 遍历完第一行后,上边界下移
        if(top>bottom)break; // 如果上边界超过了下边界,结束循环
        for(let i=top;i<=bottom;i++){ // 从上到下遍历最后一列
            res.push(matrix[i][right]); // 将最后一列的元素添加到结果数组
        }
        right--; // 遍历完最后一列后,右边界左移
        if(right<left)break; // 如果右边界小于左边界,结束循环
        for(let i=right;i>=left;i--){ // 从右到左遍历最后一行
            res.push(matrix[bottom][i]); // 将最后一行的元素添加到结果数组
        }
        bottom--; // 遍历完最后一行后,下边界上移
        if(bottom<top) break; // 如果下边界小于上边界,结束循环
        for(let i=bottom;i>=top;i--){ // 从下到上遍历第一列
            res.push(matrix[i][left]); // 将第一列的元素添加到结果数组
        }
        left++; // 遍历完第一列后,左边界右移
        if(left>right) break; // 如果左边界超过了右边界,结束循环
    }
    return res; // 返回结果数组
};

案例分析

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]

输出:[1,2,3,6,9,8,7,4,5]

逐步分析:

  1. 初始化边界:

    • left = 0
    • right = 2
    • top = 0
    • bottom = 2
  2. 第一次循环:

    • 从左到右遍历第一行(top行):[1, 2, 3] 添加到 res
      • res = [1, 2, 3]
    • top++(top = 1)
    • 检查边界:top <= bottom(1 <= 2),继续。
  3. 第二次循环:

    • 从上到下遍历最后一列(right列):[6, 9] 添加到 res
      • res = [1, 2, 3, 6, 9]
    • right--(right = 1)
    • 检查边界:right >= left(1 >= 0),继续。
  4. 第三次循环:

    • 从右到左遍历最后一行(bottom行):[8, 7] 添加到 res
      • res = [1, 2, 3, 6, 9, 8, 7]
    • bottom--(bottom = 1)
    • 检查边界:bottom >= top(1 >= 1),继续。
  5. 第四次循环:

    • 从下到上遍历第一列(left列):[4] 添加到 res
      • res = [1, 2, 3, 6, 9, 8, 7, 4]
    • left++(left = 1)
    • 检查边界:left <= right(1 <= 1),继续。
  6. 第五次循环:

    • 从左到右遍历第二行(top行):[5] 添加到 res
      • res = [1, 2, 3, 6, 9, 8, 7, 4, 5]
    • top++(top = 2)
    • 检查边界:top > bottom(2 > 1),循环结束。

结论:

循环在第五次遍历后结束,因为此时 top > bottom 的条件满足。因此,最终结果数组 res 为 [1, 2, 3, 6, 9, 8, 7, 4, 5]。

相关推荐
D e re k ZH3 小时前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试
释厄6234 小时前
同性线套娃律——圆面积必然=1+2+...+n 的求和·圆心不与 π 相关
java·人工智能·算法·1024程序员节
暴力求解4 小时前
C++ ---继承(二)
开发语言·c++·算法
码林拾遗WJ5 小时前
告警分级的自动化实测:模型判断 vs 人工拍板
人工智能·算法·自动化
Tisfy5 小时前
LeetCode 0453.最小操作次数使数组元素相等:两次遍历(反向思维)
算法·leetcode·题解·遍历·反向思维
君万5 小时前
【LeetCode每日一题】回溯:46. 全排列 78. 子集 39. 组合总和
算法·leetcode·go
Keep_Trying_Go6 小时前
Consistent-Point半监督人群计数算法详解
人工智能·深度学习·算法·计算机视觉·人群计数
在所不辞兄6 小时前
【零基础学智能仿真-69】综合项目——材料参数驱动的仿真研究
人工智能·深度学习·神经网络·算法·机器学习·1024程序员节
Tisfy7 小时前
LeetCode 3665.统计镜子反射路径数目:三个动态规划数组
leetcode·动态规划·代理模式·题解
怕浪猫7 小时前
Super-agent 在各大模型厂商的应用情况
算法·面试·github