LeetCode54-螺旋矩阵 | 算法练习系列

1,210 阅读2分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

前言

螺旋矩阵是一道很有意思的题目,螺旋矩阵也就是从二维数组中取出各项,其实没什么特定的算法来解螺旋矩阵,只要把四个边界(向右,向下,向左,向上)考虑好就可以了,下面看题目

题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1:

image.png

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

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

示例 2:

image.png

输入: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]

解题思路

  • 本题的核心是考虑上下左右的四个边距问题,然后把二维数组依次遍历
  • 定义direction来标记此时是往那个方向遍历
  • 分别定义left,right,bottom,top,每次循环之后更改direction的值和对应的left,right,top,bottom
  • 往右遍历的时候top是不变的,往下遍历的时候right是不变的,往左遍历的时候bottom是不变的,往上遍历的时候left是不变的,这点非常关键
  • 注意边界问题,要带上等于的情况,下面上代码
/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(matrix) {
    if(matrix.length === 0){ //判断输入是否为空数组
        return []
    }
    //定义四个方向,分别为右,下,左,上
    let top = 0
    let bottom = matrix.length-1
    let left = 0
    let right = matrix[0].length-1
    let direction = 'right' 
    let result = []
    while(left<=right && top<=bottom){ //当左小于右,上小于下,一直循环
        if(direction==='right'){ 
            for(let i=left;i<=right;i++){
                 result.push(matrix[top][i]) //往右的情况下top是不变的
            }
            top++
            direction='down'
        }else if(direction==='down'){
            for(let i=top;i<=bottom;i++){
                 result.push(matrix[i][right]) //往右的情况下right是不变的
            }
            right--
            direction = 'left'
        }else if(direction==='left'){
            for(let i=right;i>=left;i--){
                result.push(matrix[bottom][i])//往右的情况下bottom是不变的
            }
            bottom--
            direction='top'
        }else if(direction==='top'){
            for(let i=bottom;i>=top;i--){
                result.push(matrix[i][left])//往右的情况下left是不变的
            }
            left++
            direction='right'
        }
    } 
    return result
};

LeetCode运行结果如下

结果.PNG

总结

本题是一个刚看起来无从下手的题目,但其实只要明确了遍历的方向以及边界问题,这道题目就会迎刃而解,gogogo