题目描述:
给定一个包含非负整数的 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
链接:
https://leetcode-cn.com/problems/minimum-path-sum
题目分析
由于只能往右或往下走,则每一格最多来自两个方向(左边或者上边)。我们采用动态规划的方法,dp[i][j]
记录从左上角到 grid[i][j]
的最小路径和,从左到右,从上到下遍历 grid
,直到右下角,得出答案 dp[m-1][n-1]
。而每一格的最小路径和也即从左边或者上边选择值较小的那一个,然后加上本身的数值。
注意左上角的最小路径和也即其本身,第一列只能来自上边,第一行只能来自左边。
1 | class Solution { |
时间复杂度:$O(mn)$,其中 $m、n$ 分别是 grid
的行数和列数。动态规划的过程对 grid
进行了一次遍历。
空间复杂度:$O(mn)$,其中 $m、n$ 分别是 grid
的行数和列数。也即动态规划数组的大小。(可以优化到 $O(\min(m,n))$,具体方法是只存储上一行或者上一列的 dp 值)