【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. 下降路径最小和(支持斜着走)

这类问题的关键在于:

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


目录
相关文章
|
10月前
|
Go
【LeetCode 热题100】字符串 DP 三连:最长回文子串、最长公共子序列 & 编辑距离(力扣5 / 1143/ )(Go语言版)
本文详细解析了字符串动态规划(DP)领域的三个经典问题:**最长回文子串**(LeetCode 5)、**最长公共子序列**(LeetCode 1143)和**编辑距离**(LeetCode 72)。通过定义状态、推导状态转移方程,结合 Go 语言实现代码,深入浅出地讲解了解题思路。从判断子串是否为回文到求解两个字符串的匹配长度,再到计算字符串转换的最小操作数,每道题都展示了 DP 的核心思想与应用场景。最后通过表格总结对比三题的异同,帮助读者更好地掌握字符串 DP 的解题技巧。
319 45
|
Linux C++ Windows
code规范 --- 驼峰命名法
code规范 --- 驼峰命名法
1464 0
|
前端开发 程序员 开发工具
解决Material Theme UI插件收费问题
解决Material Theme UI插件收费问题
解决Material Theme UI插件收费问题
|
存储 数据挖掘 大数据
Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(一)
Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(一)
1665 0
Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(一)
|
4月前
|
弹性计算 人工智能 应用服务中间件
阿里云服务器最新收费价格表:含年付、月付及小时计费标准
今年阿里云服务器推出多重优惠活动,覆盖 ECS 云服务器、轻量应用服务器、GPU 服务器等主流机型,支持北京、上海、中国香港、新加坡、日本、美国等多地域部署。爆款配置性价比突出,轻量应用服务器低至 38 元 / 年,ECS 经济型服务器 99 元 / 年起,GPU 服务器小时计费 1.2 元起,满足个人开发者、企业及 AI 训练等不同场景需求。
|
11月前
|
存储 算法 Go
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
LeetCode 17题解题思路采用回溯算法,通过递归构建所有可能的组合。关键点包括:每位数字对应多个字母,依次尝试;递归构建下一个字符;递归出口为组合长度等于输入数字长度。Go语言实现中,使用map存储数字到字母的映射,通过回溯函数递归生成组合。时间复杂度为O(3^n * 4^m),空间复杂度为O(n)。类似题目包括括号生成、组合、全排列等。掌握回溯法的核心思想,能够解决多种排列组合问题。
478 11
|
10月前
|
分布式计算 算法 Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本文讲解了两道经典的图论问题:**岛屿数量(LeetCode 200)** 和 **腐烂的橘子(LeetCode 994)**,分别通过 DFS/BFS 实现。在“岛屿数量”中,利用深度或广度优先搜索遍历二维网格,标记连通陆地并计数;“腐烂的橘子”则采用多源 BFS,模拟腐烂传播过程,计算最短时间。两者均需掌握访问标记技巧,是学习网格搜索算法的绝佳实践。
467 1
|
10月前
|
Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本篇博客详细解析了三道经典的动态规划问题:198. 打家劫舍(线性状态转移)、279. 完全平方数与322. 零钱兑换(完全背包问题)。通过 Go 语言实现,帮助读者掌握动态规划的核心思想及其实战技巧。从状态定义到转移方程,逐步剖析每道题的解法,并总结其异同点,助力解决更复杂的 DP 问题。适合初学者深入理解动态规划的应用场景和优化方法。
321 0
|
安全 开发工具 git
git合并错了,我想回退到之前的版本
git合并错了,我想回退到之前的版本
|
存储 算法 安全
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
HashMap常见面试题:红黑树、散列表,HashMap实现原理、扩容机制,HashMap的jd1.7与jdk1.8有什么区别,寻址算法、链表何时升级为红黑树、死循环