• 数据结构与算法之矩阵: Leetcode 134. 螺旋矩阵 (Typescript版)


    螺旋矩阵

    • https://leetcode.cn/problems/spiral-matrix/

    描述

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

    示例 1



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

    示例 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]
    
    • 1
    • 2

    提示

    • m == matrix.length
    • n == matrix[i].length
    • 1 <= m, n <= 10
    • -100 <= matrix[i][j] <= 100

    算法实现

    1 )减而治之递归实现

    function spiralOrder(matrix: number[][]): number[] {
        // 处理每一圈的数据遍历过程
      const map = (arr: number[][], r: number[] = []) => {
        // 第一圈的遍历:遍历的时候不会按照 if else if 的顺序遍历,而是会按照一行一行的遍历,所以最终顺序不用担心
        for (let i = 0, len = arr.length; i < len; i++) {
          if (i === 0) {
            r = r.concat(arr[i])
          } else if (i === len - 1) {
            r = r.concat(arr[i].reverse())
          } else {
            // 增加边界检查
            if (arr[i].length) {
              r.push(arr[i].pop())
            }
          }
        }
        arr.shift() // 减而治之:移除第一行
        arr.pop() // 减而治之:移除最后一行
        // 第一圈最后的遍历: 倒序,从下到上
        for (let i = arr.length - 1; i >= 0; i--) {
          // 边界检查
          if (arr[i].length) {
            r.push(arr[i].shift())
          }
        }
        // 边界判断,是否还有,有则进行递归
        if (arr.length) {
          return map(arr, r)
        }
        // 没有直接返回
        return r;
      }
      return map(matrix, [])
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 没办法一次性一圈圈的描述出来,但是可以把一圈的过程描述出来
    • 描述一圈经历了几件事: 顺时针
      • 二维矩阵第一行 (从做到右)
      • 二维矩阵最后一列 (从上到下)
      • 二维矩阵倒数第一行 (从右到左)
      • 二维矩阵第一列 (从下到上)
    • 整体算法
      • 先遍历第一圈,减而治之
      • 如果还有,则递归实现
  • 相关阅读:
    Jmeter接口自动化测试 —— Jmeter下载安装及入门
    SpringBoot SpringBoot 开发实用篇 6 监控 6.5 health 端点指标控制
    升本政治冲冲冲
    sql server如主键创建时候没有命名,如何利用sql语句删除呢?
    arguments
    设计模式的六大原则
    结构型模式-装饰器模式
    CRM客户关系管理系统开发源码小程序
    想要做好代码质量,如何破局?
    1 dB压缩点_噪声系数_小信号非线性的数学描述
  • 原文地址:https://blog.csdn.net/Tyro_java/article/details/134026430