Leetcode64. 最小路径和
Leetcode64. 最小路径和
题目描述
给定一个包含非负整数的 *m* x *n*
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
**说明:**每次只能向下或者向右移动一步。
示例 1:
1 | 输入:grid = [[1,3,1],[1,5,1],[4,2,1]] |
示例 2:
1 | 输入:grid = [[1,2,3],[4,5,6]] |
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
解题思路
这道题是经典的动态规划题。
由于路径的方向只能是向下或向右,因此网格的第一行的每个元素只能从左上角元素开始向右移动到达,网格的第一列的每个元素只能从左上角元素开始向下移动到达,此时的路径是唯一的,因此每个元素对应的最小路径和即为对应的路径上的数字总和。
对于不在第一行和第一列的元素,可以从其上方相邻元素向下移动一步到达,或者从其左方相邻元素向右移动一步到达,元素对应的最小路径和等于其上方相邻元素与其左方相邻元素两者对应的最小路径和中的最小值加上当前元素的值。
创建一个二维数组,表示从左上角出发到位置的最小路径和。显然,有以下公式:
\begin{eqnarray} && 其实条件:dp[i][j]=grid[0][0]; \\\\ && 当i>0且j=0时,\quad dp[i][0]=dp[i-1][0]+grid[i][0]; \\\\ && 当i=0且j>0时,\quad dp[0][j]=dp[0][j-1]+grid[0][j]; \\\\ && 当i>0且j>0时,\quad dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]; \end{eqnarray}最后得到的即为所求。
具体细节如示例代码所示:
示例代码
1 | int minPathSum(vector<vector<int>>& grid) |
时间复杂度:,其中$ m $和 分别是网格的行数和列数。
空间复杂度:,其中$ m $和 分别是网格的行数和列数。
空间复杂度可以通过滚动数组优化到!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 二进制的叮当喵!