题目:
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
Example:
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.
解答:
本题与LeetCode 63 题采用相同的思路和解法,都是动态规划。
假设题中的矩阵:
解题思路为:
- 创建二维数组sum,其中数组中以每个小格为单位,存储路径到达该单元格时,最小的路径数值和
- 起始状态为左上角的单元格。路径值即为数组grid中该单元格的值
- 第一行中,到达每个单元格的路径值 = 当前单元格的值 + 左一个单元格内路径值
- 第一列中,到达每个单元格的路径值 = 当前单元格的值 + 上一个单元格内路径值
(如下图,为上面二维数组的路径值的起始状态)
- 因为路径只能向右或者向下走,则其余单元格的路径值 = 上方或左边单元格的路径最小值 + 当前单元格的值
实现代码如下:
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[][] sum = new int[m][n];
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(i==0 && j==0) {
sum[i][j] = grid[i][j];
}else if(i==0 && j>0) {
sum[i][j] = grid[i][j] + sum[i][j-1];
}else if(j==0 && i>0) {
sum[i][j] = grid[i][j] + sum[i-1][j];
}else {
sum[i][j] = Math.min(sum[i-1][j], sum[i][j-1]) + grid[i][j];
}
}
}
return sum[m-1][n-1];
}
}