news 2026/2/22 15:45:32

LeetCode 64. Minimum Path Sum 动态规划详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 64. Minimum Path Sum 动态规划详解

本文整理这道题的题意、思路推导、状态设计、边界处理,以及一份 C 语言实现,并顺带对一些容易在面试中被问到的细节做说明。leetcode+1​

题目理解

给定一个 m x n 的网格 grid,每个格子里是一个非负整数。leetcode​
从左上角 (0,0) 出发,只能向右或向下移动,走到右下角 (m-1, n-1)。leetcode​
要求:找到一条路径,使路径上所有格子数字之和最小,并返回这个最小和。leetcode​
示例:
grid = [[1,3,1],[1,5,1],[4,2,1]],答案为 7,路径为 1 → 3 → 1 → 1 → 1。leetcode​
grid = [[1,2,3],[4,5,6]],答案为 12。leetcode​
约束:
1 <= m, n <= 200,0 <= grid[i][j] <= 200。leetcode​

动态规划思路推导

1. 状态定义

设一个与 grid 同大小的二维数组 dp:
状态含义:dp[i][j] 表示从起点 (0,0) 走到格子 (i,j) 的最小路径和。
这样,最终目标就是求 dp[m-1][n-1]。

2. 状态转移

从起点往终点推导每个格子的最小路径和:
起点:
dp[0][0] = grid[0][0]
第一行 i == 0:
只能从左边走过来:
dp[0][j] = dp[0][j-1] + grid[0][j]
第一列 j == 0:
只能从上边走过来:
dp[i][0] = dp[i-1][0] + grid[i][0]
其他位置 (i > 0, j > 0):
只能从上方 (i-1,j) 或左方 (i,j-1) 过来,取路径和较小的那条:
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
这正好对应你一开始写下的转移方程,思路是正确的,只是最后返回值当时写成了"最后一行的最小值",与题目"必须到右下角"不一致,后面你在代码中已经修正为右下角坐标。leetcode​

边界与实现细节

1. 初始化与默认值

在 C 代码中,为了方便统一转移,你给 dp 初始填了一个很大的值 INF_MAX = 0x7fffffff:

#defineINF_MAX0x7fffffff

然后 dp[i][j] 全部初始化为 INF_MAX,再从 (0,0) 开始,用转移公式迭代更新。
实际上这道题因为边界(i == 0 和 j == 0)单独处理了,INF_MAX 更多是防御性初始化,可以保留,也可以不依赖它来写逻辑。leetcode​

2. 边界跳过起点

代码里:

if(i==0&&j==0)continue;

对 (0,0) 直接跳过,是因为已经单独设定了 dp[0][0] = grid[0][0],避免在转移时又被覆盖或访问到负索引。
这在面试时是加分点:说明清楚起点是"手动初始化",循环里只处理除起点外的其他格子。leetcode​

C 语言代码实现

下面是你提交并 AC 的 C 代码,时间 0ms,击败 100%,逻辑清晰、边界正确、空间也正常释放了内存。leetcode​

#include<stdlib.h>#defineINF_MAX0x7fffffff#defineMIN(a,b)((a)<(b)?(a):(b))intminPathSum(int**grid,intgridSize,int*gridColSize){inti,j,result,col_size;int**dp;dp=(int**)malloc(gridSize*sizeof(int*));for(i=0;i<gridSize;i++){col_size=gridColSize[i];dp[i]=(int*)malloc(col_size*sizeof(int));for(j=0;j<col_size;j++)dp[i][j]=INF_MAX;}dp[0][0]=grid[0][0];for(i=0;i<gridSize;i++){col_size=gridColSize[i];for(j=0;j<col_size;j++){if(i==0&&j==0)continue;if(i==0)dp[i][j]=dp[i][j-1]+grid[i][j];elseif(j==0)dp[i][j]=dp[i-1][j]+grid[i][j];elsedp[i][j]=MIN(dp[i][j-1]+grid[i][j],dp[i-1][j]+grid[i][j]);}}col_size=gridColSize[gridSize-1];result=dp[gridSize-1][col_size-1];for(i=0;i<gridSize;i++)free(dp[i]);free(dp);returnresult;}

复杂度分析:
时间复杂度:遍历整张表一次,O(mn)。
空间复杂度:使用了一个与 grid 同大小的 dp 数组,O(mn) 额外空间。leetcode​

可能的面试追问与优化方向

能否不使用额外二维 dp 数组,直接在 grid 上原地累加,从而把额外空间从 O(mn) 优化到 O(1)?leetcode​
如果只用一维数组(按行或按列滚动),如何写状态转移,空间复杂度可以优化到 O(min(m,n))?leetcode​

https://leetcode.com/problems/minimum-path-sum/?envType=study-plan-v2&envId=top-interview-150
https://leetcode.com/problems/minimum-path-sum/description/?envType=study-plan-v2&envId=top-interview-150
https://leetcode.com/problems/minimum-path-sum/submissions/1871120418/?envType=study-plan-v2&envId=top-interview-150

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/14 22:16:26

Ranger部署

最近要使用ranger来负责Hadoop-HDFS的路径权限,在此分享记录一下从源码编译开始的部署方式 一、Ranger的安装需要从源码开始编译,因此你需要在Linux上准备好下面的东西 maven3 我本地编译ranger26用的3.9.9的 git python3 这里有个大坑,编译时要py3,但是后面初始化脚本又…

作者头像 李华
网站建设 2026/2/16 22:57:57

Python 图形任意角度旋转完整解决方案:原理、实现与可视化展示

在 Python 图像处理、计算机视觉、数据可视化等领域&#xff0c;图形旋转是一项基础且高频的操作。无论是图像矫正、数据图表旋转&#xff0c;还是游戏开发中的精灵动画&#xff0c;都需要实现精准的任意角度旋转&#xff08;含 0-360 整数角度与小数角度&#xff09;。本文将从…

作者头像 李华
网站建设 2026/2/17 1:14:46

当路径规划遇上时间窗:冷链物流那些不得不说的套路

路径规划&#xff0c;车辆路径优化&#xff0c;MATLAB&#xff0c;带时间窗及其他各类需求均可&#xff0c;基于车辆的带时间窗的车辆路径优化VRPTW问题。 冷链物流车辆路径优化&#xff0c;考虑充电桩车辆路径evrp&#xff0c;多配送中心车辆路径优化。 改进遗传算法车辆路径优…

作者头像 李华
网站建设 2026/2/10 23:03:52

4.1 Client-go架构解密:Kubernetes客户端开发核心技术剖析

5.1 Client-go架构解密:Kubernetes客户端开发核心技术剖析 在云原生时代,Kubernetes已经成为容器编排的事实标准。而Client-go作为官方提供的Go语言客户端库,是我们与Kubernetes API交互的核心工具。本节课我们将深入剖析Client-go的架构设计,帮助你全面掌握这个强大的客户…

作者头像 李华
网站建设 2026/2/21 14:02:58

5.1 ChatGPT API 接入实战:让你的应用拥有智能对话能力

5.1 ChatGPT API 接入实战:让你的应用拥有智能对话能力 在AIOps时代,将大语言模型集成到企业应用中已成为提升智能化水平的重要手段。OpenAI的ChatGPT API为开发者提供了简单而强大的接口,可以快速为应用添加智能对话能力。本文将详细介绍如何接入和使用ChatGPT API,并通过…

作者头像 李华