1. 题目解析与解题思路
最小路径和问题是一个经典的动态规划题目,题目要求在一个m×n的网格中,从左上角出发,每次只能向右或向下移动,最终到达右下角,求经过路径上的数字总和的最小值。
1.1 问题理解与建模
这个问题可以抽象为一个二维网格上的最优路径问题。给定一个包含非负整数的m×n网格grid,我们需要找到一条从左上角(0,0)到右下角(m-1,n-1)的路径,使得路径上的数字总和最小。
关键观察点:
- 移动方向限制:只能向右或向下移动
- 起点和终点固定:左上角到右下角
- 路径总和计算:所有经过格子的数值之和
1.2 动态规划思路分析
动态规划是解决这类问题的理想方法,因为它可以有效地分解问题并避免重复计算。我们可以定义dp[i][j]为从起点(0,0)到位置(i,j)的最小路径和。
状态转移方程需要考虑三种情况:
- 第一行(i=0):只能从左边的格子过来
- 第一列(j=0):只能从上边的格子过来
- 其他位置:可以从上方或左方过来,取较小值
状态转移方程可以表示为:
code复制dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1]) // 一般情况
dp[0][j] = grid[0][j] + dp[0][j-1] // 第一行
dp[i][0] = grid[i][0] + dp[i-1][0] // 第一列
dp[0][0] = grid[0][0] // 起点
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现与优化
2.1 基础实现方案
原始代码提供了一个原地修改的解决方案,直接在输入的grid数组上进行计算,节省了额外的空间。这种实现方式的时间复杂度为O(mn),空间复杂度为O(1)(不考虑输入空间)。
java复制class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length, n = grid[0].length;
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
if(i==0&&j==0) {
