Leetcode前端必会系列:螺旋矩阵

98 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

引言

算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。

题目描述

给你一个 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. 设计上下左右四个标记位置的指针,分别位于二维数组的边界位置上
  2. 首先按照从左上到右上顺序遍历
  3. 右上到右下顺序遍历
  4. 右下到左下顺序遍历
  5. 左下到左上顺序遍历
  6. 返回结果

解答

 /**

 * @param {number[][]} matrix

 * @return {number[]}

 */

var spiralOrder = function(matrix) {

  let res = []

  let top,bot,left,right

  top = left = 0

  bot = matrix.length-1

  right = matrix[0].length-1




  while(true) {

    //1.左上到右上

    for(let i=left;i<=right;i++) {

      res.push(matrix[top][i])

    }

    top++

    if(top>bot || left>right) return res



    //右上到右下

    for(let i=top;i<=bot;i++) {

      res.push(matrix[i][right])

    }

    right--

    if(top>bot || left>right) return res




    //右下到左下

    for(let i=right;i>=left;i--) {

      res.push(matrix[bot][i])

    }

    bot--

    if(top>bot || left>right) return res

    //左下到左上

    for(let i=bot;i>=top;i--) {

      res.push(matrix[i][left])

    }

    left++

    if(top>bot || left>right) return res

  }



};

通过题目的分析,我们按照题目的需求成功的设计了螺旋矩阵的遍历过程,整体的设计需要严格按照上下左右边界进行遍历。。

总结

螺旋矩阵需要我们仔细分析问题,通过对问题的拆解可以快速的完成对问题的求解。我们必须牢固的掌握其在具体应用和实践的应用。