题目
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
分析
一般求这种最小路径等最优解的情况,我们一般可以想到都是采用动态规划算法。然后我们只要抓住动态规划算法的两点:
- 大问题是否可以拆分成小问题(实际上任何大问题都可以拆分成小问题)
- 这些小问题的解是否可以重复利用,且需要保存解以备后续利用
根据说明每次只能向下或者向右走一格,所以我们反向思维,从后往前,题目要求最小路径,那么最后一个的最小路径只能是左边一个或者上面一个来的,那么具体是哪一个呢,其实就是哪一个最小选哪一个。以此类推可以得出公式grid[i][j] = grid[i][j]+min(grid[i-1][j] ,grid[i][j-1])。
题解
class Solution {
public int minPathSum(int[][] grid) {
int m = grid[0].length;
int n = grid.length;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(i==0 && j>0){
grid[i][j] =grid[i][j]+grid[i][j-1];
}
if(i>0 && j==0) {
grid[i][j]+=grid[i-1][j];
}
if(i-1>=0 && j-1>=0){
int temp = grid[i - 1][j] > grid[i][j - 1] ? grid[i][j - 1] : grid[i - 1][j];
grid[i][j] = grid[i][j]+temp;
}
}
}
return grid[n-1][m-1];
}
}