当前位置: 首页 > article >正文

数据结构与算法之矩阵: 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]

示例 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 )减而治之递归实现

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, [])
};
  • 没办法一次性一圈圈的描述出来,但是可以把一圈的过程描述出来
  • 描述一圈经历了几件事: 顺时针
    • 二维矩阵第一行 (从做到右)
    • 二维矩阵最后一列 (从上到下)
    • 二维矩阵倒数第一行 (从右到左)
    • 二维矩阵第一列 (从下到上)
  • 整体算法
    • 先遍历第一圈,减而治之
    • 如果还有,则递归实现

http://www.kler.cn/news/106940.html

相关文章:

  • Spring Boot集成RESTful API
  • el-table添加固定高度height后高度自适应
  • 【前端】NodeJS核心知识点整理
  • Git(SourceTree)变基操作使用
  • 配置Sentinel 控制台
  • 全景环视AVM标定
  • 虚拟化 vs. 裸金属:K8s 部署环境架构与特性对比
  • CSS 滚动驱动动画与 @keyframes 新语法
  • 406. 根据身高重建队列
  • 毅速丨哪些金属材料在3D打印中应用最多
  • 【跟小嘉学 Rust 编程】三十三、Rust的Web开发框架之一: Actix-Web的基础
  • 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉 计算机竞赛
  • Java操作符
  • R语言入门看这一章就够了(上)
  • SQL查询优化---如何查询截取分析
  • C++之特殊类的设计
  • MATLAB中polyvalm函数用法
  • Java零基础入门-关系运算符
  • Splunk 之 filed 恢复
  • unity面试八股文 - 常用工具与算法
  • Map集合 遍历:lambda方式
  • 计算机视觉的相机选型
  • 力扣labuladong——一刷day09
  • 通过阿里云创建accessKeyId和accessKeySecret
  • 线程池的理解
  • 字符串与基本类型之间的相互转换
  • vue2组件库-上传组件
  • 框架安全-CVE 复现SpringStrutsLaravelThinkPHP漏洞复现
  • Peter算法小课堂—归并排序
  • 【Linux】安装与配置虚拟机及虚拟机服务器坏境配置与连接