一起刷LeetCode——螺旋矩阵(模拟)

77 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

螺旋矩阵

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

分析

  • 模拟题目说的螺旋方式即可得到最终的答案

模拟

  • 按照题意,矩阵从左上角开始,使用四个变量来记录当前遍历圈在整个矩阵中的情况
  • 按照圈遍历,每一圈都是从左到右,从上到下,从右到左,从下到上的顺序
  • 每圈遍历完,圈都往里缩一圈,可以使用四个变量来记录当前遍历圈在整个矩阵中的情况
  • 根据这样的遍历规则,直到遍历完整个矩阵

代码

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(matrix) {
    let result = []
    let left = 0
    let right = matrix[0].length
    let top = 0
    let bottom = matrix.length
    let size = right * bottom
    while( result.length<size ){
        for( let i = left ; i<= right && result.length<size ; i++ ){
            result.push(matrix[top][i]);
        }
        top++;
        for( let i = top ; i <= bottom && result.length<size ; i++ ){
            result.push(matrix[i][right]);
        }
        right--;
        for( let i = right ; i>= left && result.length<size ; i-- ){
            result.push(matrix[bottom][i]);
        }
        bottom--;
        for( let i = bottom ; i>= top && result.length<size ; i-- ){
            result.push(matrix[i][left])
        }
        left++;
    }
    return result;
};

矩阵转置

  • 遍历的时候,可以使用变量来控制方向,保持矩阵不变,是否可以通过改变矩阵,方向不变来遍历呢?
  • 答案是可以,当保持从左到右的方向时,当从上向下遍历矩阵的时候,如果这部分矩阵向左转90度之后,就可以继续从左到右遍历,当从右到左遍历矩阵,在上次左转90度的基础上再左转90度就可以是从左到右就可以了,同样的从下向上的矩阵部分,在从上向下的时候左转90度,从右到左的时候旋转90度,这个时候再旋转90度,就可以保持从左到右了
  • 矩阵转起来的时候,方向就一致了,可以类比削水果,从上开始削,刀的方向没有变化,最后削的皮试一个螺旋形状的

代码

var spiralOrder = function(matrix) {
  const res = []
  while(matrix.length){
    const first = matrix.shift()
    res.push(...first)
    for(const m of matrix){
      let val = m.pop()
      if(val)
        res.push(val)
        m.reverse()   
    }
    matrix.reverse()
  }
  return res
};

总结

  • 螺旋的矩阵,让矩阵不变时,需要通过遍历的方向,当方向不变时,需要更改矩阵,当把矩阵转起来的时候,就打开了解决矩阵的新大门
  • 今天也是有收获的一天