【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)

简介: 本篇介绍了网格路径类动态规划问题,涵盖 LeetCode 第 62 题“不同路径”和第 64 题“最小路径和”。通过定义状态 `dp[i][j]` 和转移方程,分别解决路径计数与最小代价问题。两题均支持一维数组优化空间复杂度。总结对比了两题的异同,并延伸至带障碍路径、三角形路径等问题,帮助读者掌握网格 DP 的核心思路:明确状态、写出转移、找准边界。

🧭 网格路径类 DP 系列题:不同路径 & 最小路径和(LeetCode 62 / 64)

  • 🧮 62. 不同路径(计算路径总数)
  • 💰 64. 最小路径和(求路径最小代价)

🧮 62. 不同路径(Unique Paths)

📌 题目描述

一个机器人位于一个 m x n 网格左上角,只能向下或向右移动,每次一步。问有多少条不同路径可以走到右下角?


🧠 解题思路

这是一道经典的二维动态规划问题。

✅ 状态定义

dp[i][j] 表示走到第 i 行第 j 列的路径数量。

🔁 状态转移

机器人只能从上方或左方到达 (i,j)

dp[i][j] = dp[i-1][j] + dp[i][j-1]

🎯 初始条件

  • 第一行 & 第一列都只有一条路径可达。

✅ Go 实现(二维 DP)

func uniquePaths(m int, n int) int {
   
    dp := make([][]int, m)
    for i := range dp {
   
        dp[i] = make([]int, n)
        dp[i][0] = 1
    }
    for j := 0; j < n; j++ {
   
        dp[0][j] = 1
    }

    for i := 1; i < m; i++ {
   
        for j := 1; j < n; j++ {
   
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
        }
    }
    return dp[m-1][n-1]
}

💡 空间优化

由于每次只依赖上一行和当前行,可以用一维数组滚动更新:

func uniquePaths(m int, n int) int {
   
    dp := make([]int, n)
    for i := range dp {
   
        dp[i] = 1
    }

    for i := 1; i < m; i++ {
   
        for j := 1; j < n; j++ {
   
            dp[j] += dp[j-1]
        }
    }
    return dp[n-1]
}

💰 64. 最小路径和(Minimum Path Sum)

📌 题目描述

给定一个 m x n 的网格,每个单元格内有一个非负整数,求从左上角到右下角一条路径,使得路径上数字总和最小。


🧠 解题思路

与上一题相似,不过这题是求最小路径代价

✅ 状态定义

dp[i][j] 表示走到 (i,j) 所需的最小路径和。

🔁 状态转移

只能从上方或左方来:

dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]

✅ Go 实现

func minPathSum(grid [][]int) int {
   
    m, n := len(grid), len(grid[0])
    dp := make([][]int, m)
    for i := range dp {
   
        dp[i] = make([]int, n)
    }

    dp[0][0] = grid[0][0]
    for i := 1; i < m; i++ {
   
        dp[i][0] = dp[i-1][0] + grid[i][0]
    }
    for j := 1; j < n; j++ {
   
        dp[0][j] = dp[0][j-1] + grid[0][j]
    }

    for i := 1; i < m; i++ {
   
        for j := 1; j < n; j++ {
   
            dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
        }
    }
    return dp[m-1][n-1]
}

func min(a, b int) int {
   
    if a < b {
   
        return a
    }
    return b
}

🔚 总结与对比

题目 目标 状态定义 转移逻辑 可否空间优化
62. 不同路径 统计路径条数 dp[i][j] 为到达 (i,j) 的路径数 dp[i-1][j] + dp[i][j-1] ✅ 可用一维数组优化
64. 最小路径和 求最小路径值 dp[i][j] 为到达 (i,j) 的最小和 min(dp[i-1][j], dp[i][j-1]) + grid[i][j] ✅ 可用一维数组优化

✏️ 思维延伸

如果想更进一步,可以尝试:

    1. 不同路径 II(加上障碍)
    1. 三角形最小路径和(从底向上 DP)
    1. 下降路径最小和(支持斜着走)

这类问题的关键在于:

✅ 明确“状态”
🔁 写出“转移”
🎯 找准“边界”


目录
相关文章
|
前端开发 程序员 开发工具
解决Material Theme UI插件收费问题
解决Material Theme UI插件收费问题
解决Material Theme UI插件收费问题
|
Linux C++ Windows
code规范 --- 驼峰命名法
code规范 --- 驼峰命名法
1514 0
|
存储 算法 编译器
【探索QTime】Qt中的时间操作与转换指南
【探索QTime】Qt中的时间操作与转换指南
2188 0
|
存储 数据挖掘 大数据
Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(一)
Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(一)
1709 0
Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(一)
|
6月前
|
弹性计算 人工智能 应用服务中间件
阿里云服务器最新收费价格表:含年付、月付及小时计费标准
今年阿里云服务器推出多重优惠活动,覆盖 ECS 云服务器、轻量应用服务器、GPU 服务器等主流机型,支持北京、上海、中国香港、新加坡、日本、美国等多地域部署。爆款配置性价比突出,轻量应用服务器低至 38 元 / 年,ECS 经济型服务器 99 元 / 年起,GPU 服务器小时计费 1.2 元起,满足个人开发者、企业及 AI 训练等不同场景需求。
|
Go
【LeetCode 热题100】字符串 DP 三连:最长回文子串、最长公共子序列 & 编辑距离(力扣5 / 1143/ )(Go语言版)
本文详细解析了字符串动态规划(DP)领域的三个经典问题:**最长回文子串**(LeetCode 5)、**最长公共子序列**(LeetCode 1143)和**编辑距离**(LeetCode 72)。通过定义状态、推导状态转移方程,结合 Go 语言实现代码,深入浅出地讲解了解题思路。从判断子串是否为回文到求解两个字符串的匹配长度,再到计算字符串转换的最小操作数,每道题都展示了 DP 的核心思想与应用场景。最后通过表格总结对比三题的异同,帮助读者更好地掌握字符串 DP 的解题技巧。
347 45
|
人工智能 资源调度 安全
密码学承诺之原理和应用 - Kate多项式承诺
密码学承诺之原理和应用 - Kate多项式承诺
|
数据可视化 项目管理 UED
如何进行有效的优先级管理:6大模型解析
优先级管理看似简单,但要真正做到高效、精准,却需要方法和技巧的支撑。3分钟了解6种优先级管理方法。
1257 0
如何进行有效的优先级管理:6大模型解析
|
存储 NoSQL 算法
Redis内存回收
Redis 基于内存存储,性能卓越,但单节点内存不宜过大,以免影响持久化或主从同步。可通过配置 `maxmemory` 限制最大内存。内存达到上限时,Redis采用两种策略:内存过期策略和内存淘汰策略。过期策略包括惰性删除和周期删除,后者分为 SLOW 和 FAST 模式。内存淘汰策略有八种,如 LRU、LFU 和随机淘汰等,用于在内存不足时释放空间。官方推荐使用 LFU 算法。
345 2
Redis内存回收
|
存储 算法 安全
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
HashMap常见面试题:红黑树、散列表,HashMap实现原理、扩容机制,HashMap的jd1.7与jdk1.8有什么区别,寻址算法、链表何时升级为红黑树、死循环

热门文章

最新文章