当前位置: 面试刷题>> 最小路径和(经典算法150题)


### 题目描述 给定一个`m x n`的网格,网格中的每个单元格都有一个整数。从左上角开始,你只能向右或向下移动到相邻的单元格。你的任务是找到从左上角到右下角的最小路径和。 **示例**: 网格如下: ``` [ [1, 3, 1], [1, 5, 1], [4, 2, 1] ] ``` 从左上角到右下角的最小路径和为 `7`。 **注意**: - 你只能向右或向下移动。 - 网格中至少包含一个单元格。 - 网格中的所有值都是非负整数。 ### PHP 示例代码 ```php function minPathSum($grid) { $m = count($grid); $n = count($grid[0]); // 初始化第一行和第一列 for ($i = 0; $i < $m; $i++) { for ($j = 0; $j < $n; $j++) { if ($i == 0 && $j > 0) { $grid[$i][$j] += $grid[$i][$j - 1]; } elseif ($j == 0 && $i > 0) { $grid[$i][$j] += $grid[$i - 1][$j]; } elseif ($i > 0 && $j > 0) { $grid[$i][$j] += min($grid[$i - 1][$j], $grid[$i][$j - 1]); } } } return $grid[$m - 1][$n - 1]; } // 示例用法 $grid = [ [1, 3, 1], [1, 5, 1], [4, 2, 1] ]; echo minPathSum($grid); // 输出 7 ``` ### Python 示例代码 ```python def minPathSum(grid): m, n = len(grid), len(grid[0]) # 初始化第一行和第一列 for i in range(1, m): grid[i][0] += grid[i-1][0] for j in range(1, n): grid[0][j] += grid[0][j-1] # 动态规划计算最小路径和 for i in range(1, m): for j in range(1, n): grid[i][j] += min(grid[i-1][j], grid[i][j-1]) return grid[m-1][n-1] # 示例用法 grid = [ [1, 3, 1], [1, 5, 1], [4, 2, 1] ] print(minPathSum(grid)) # 输出 7 ``` ### JavaScript 示例代码 ```javascript function minPathSum(grid) { const m = grid.length; const n = grid[0].length; // 初始化第一行和第一列 for (let i = 1; i < m; i++) { grid[i][0] += grid[i-1][0]; } for (let j = 1; j < n; j++) { grid[0][j] += grid[0][j-1]; } // 动态规划计算最小路径和 for (let i = 1; i < m; i++) { for (let j = 1; j < n; j++) { grid[i][j] += Math.min(grid[i-1][j], grid[i][j-1]); } } return grid[m-1][n-1]; } // 示例用法 const grid = [ [1, 3, 1], [1, 5, 1], [4, 2, 1] ]; console.log(minPathSum(grid)); // 输出 7 ``` 这些示例代码均采用了动态规划的思想,通过原地修改网格中的值来避免额外的空间复杂度,最终返回从左上角到右下角的最小路径和。
推荐面试题