【每天学习一点算法 2026/05/25】矩阵中的最长递增路径

每天学习一点算法 2026/05/25

题目:矩阵中的最长递增路径

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。

这个题的思路还是很简单的,只需要以每个单元格作为起点遍历出所有的递增路径取出最长的就是整个矩阵中最长的递增路径,但是这个过程肯定会有重复的,我们可以采取一些措施减少重复遍历。

我们需要记录每个已遍历单元格作为起点的的最长递增路径长度,我们可以直接利用深度优先遍历,回归时记录每个单元格的最长路径。记录方法最容易想到的就是map,我们也可以将原单元格替换成一个二维数组用于记录当前数字和最长递增路径长度,这样同样可以实现记录的功能。

typescript 复制代码
function longestIncreasingPath(matrix: (number | number [])[][]): number {
  let res = 0 // 用于存储最长路径长度
  const m = matrix.length
  const n = matrix[0].length
  // 遍历网格元素
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      // 如果单元格元素是数组表示已经遍历过了,直接跳过
      if (Array.isArray(matrix[i][j])) continue
      const len = dfs(i, j, null) // 调用深度优先遍历方法获取当前元素作为起点最长路径长度
      res = Math.max(res, len) // 对比存储最大值
    }
  }

  return res // 返回最长路径长度

  // 深度优先遍历辅助函数
  function dfs (i: number, j: number, prev: number | null) {
    if (i < 0 || j < 0 || i >= m || j >= n) return 0 // 超出边界直接返回 0
    const current = matrix[i][j] // 当前单元格元素
    // 如果元素是数组,表示已经遍历过
    if (Array.isArray(current)) {
      // 如果数字大于当前上一个单元格数组返回它的最长路径长度,否则返回 0
      return current[0] <= prev ? 0 : current[1]
    }
    
    // 如果元素是数字,未遍历过
    if (prev !== null && current <= prev) return 0 // 如果小于上个数字返回 0
    // 递归上下左右方向
    const top = dfs(i - 1, j, current)
    const bottom = dfs(i + 1, j, current)
    const left = dfs(i, j - 1, current)
    const right = dfs(i, j + 1, current)
    // 获得各个方向中的最长路径加一就是当前的最长路径
    const max = Math.max(top, bottom, left, right) + 1
    // 存储并返回当前元素的最长路径
    matrix[i][j] = [current, max]
    return max
  }
};

题目来源:力扣(LeetCode)

相关推荐
wabs6662 小时前
关于图论【卡码网110.字符串迁移的思考】
数据结构·算法·图论
hanlin033 小时前
刷题笔记:力扣第242、349题(哈希表)
笔记·算法·leetcode
茯苓gao3 小时前
嵌入式开发笔记:CAN与CAN FD完全指南——从帧格式差异到MCU选型实战
网络·笔记·stm32·嵌入式硬件·学习·汽车
木木_王3 小时前
嵌入式学习 | STM32 裸板驱动开发(Day06) | DHT11温湿度传感器超详解(单总线时序+全套驱动代码+智能温湿度报警项目)
驱动开发·stm32·学习
FellAveal4 小时前
【Go语言入门学习笔记】Part19.速率控制、原子计数器、互斥锁(Mutex)、状态协程
笔记·学习·golang
only-qi4 小时前
大模型Agent面试攻略:落地工程痛点、评估体系与Agentic RAG核心精讲
人工智能·算法·面试·职场和发展·langchain·rag
你怎么知道我是队长4 小时前
经典蓝牙(Bluetooth Classic / BR/EDR)学习计划
学习
极地野狼 音乐哔哔4 小时前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
学习·microsoft
Gauss松鼠会6 小时前
【GaussDB】GaussDB锁阻塞源头查询
java·开发语言·前端·数据库·算法·gaussdb·经验总结
oier_Asad.Chen6 小时前
【洛谷题解/AcWing题解】洛谷P4011 孤岛营救问题/AcWing1131拯救大兵瑞恩
数据结构·笔记·学习·算法·动态规划·图论·宽度优先